1. 程式人生 > 實用技巧 >事務中傳送訊息產生的問題

事務中傳送訊息產生的問題

這次的場景是,外部模組接受到訊息會呼叫我們的回撥介面,更新發送訊息前插入的資料,但現在出現了插入的資料找不到的情況,而進入資料庫檢視插入的資料是存在的

@Transctional
public CmsCustomerDetailResult getDetail(){
//操作資料庫,插入資料
...
sendKafkaMessage();

}


**猜測原因:發kafka訊息是瞬發的,而插入資料庫的操作被註解式事務鎖定,要傳送訊息後才提交,如果外部系統回撥太快就會出現這種情況 **

修改後:取消註解式事務,使用帶返回值的程式設計式事務縮小事務的粒度,提交後再發訊息

 Boolean execute = transactionTemplate.execute(transactionStatus -> {
            dao.insert(customerMergeRecordEntity);
            dao.insertBatch(feedbackRecordEntityList);
            dao.updateFields(customerEntity, true, "isEnable", "customerPhaseType");
            return true;
        });
        if (execute) {
          sendKafkaMessage();
        }

修改後問題還存在,發現是某個外部模組消費過快,幾乎是馬上返回,沒辦法了,只能在sendKafkaMessage()之前加上sleep(500)睡半秒,問題解決