1. 程式人生 > 實用技巧 >傳送訊息 缺少 更新的欄位值

傳送訊息 缺少 更新的欄位值

背景

先看一段程式碼:

@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的執行的時間點 隨機了 沒有必然的 先後順序了。