发送消息 缺少 更新的字段值

背景

先看一段代码:

@Transactional(rollbackFor = Exception.class)
    public boolean cancel(OrderRequest request) {
        long start = System.currentTimeMillis();
        String orderId = request.getOrderId();
        String operator = request.getOperator();
        String cancelMsg = request.getCancelMsg();

        ....
          //1,更新 calcelMsg 到 order
        updateCancelMsg(cancelMsg, order);

       //notify
      //2、从order中获取 cancleMsg 直接发送消息。 是@Async 方法
       asynTaskService.notify(orderId,ORDER_CANCEL);
        //修正
       // asynTaskService.notifyOss(orderId, cancelMsg, ORDER_CANCEL);
                

        //3、其他业务逻辑
				...
          
        } catch (Exception e) {
           ...
        } finally {
            ...
        }

        return true;
    }

从这个代码中 能 发现问题吗?

在本地 调试的时候,没有发现问题,在测试环境 三方联调的时候, 基本是 必现的问题。问题反馈后,有调式,没问题....。检查了所有环境,配置,jar。 问题肯定是存在的。重新 审视代码。

排查

步骤一

打log。 在回调信息中,吧 获取到的 cancleMsg 和order信息打印出来。

确实发现了问题。

发送消息 缺少 更新的字段值

获取时的时间 早于 更新 驳回消息的时间。这就是问题所有。

步骤二

回归代码,查找问题的根源。

@Transactional

@Async

这个方法中使用了 Transactional, 并且 notify 方法用了异步。

Transactional 的存在,使 更新 cancelMsg 的 commit 时间点 延后了,

异步化,是 notify的执行的时间点 随机了 没有必然的 先后顺序了。

上一篇:SpringBoot 快速开启事务(附常见坑点)


下一篇:@Transactional 事务提交之后执行 @Async 修饰的方法