事務中傳送訊息產生的問題
阿新 • • 發佈:2020-08-11
這次的場景是,外部模組接受到訊息會呼叫我們的回撥介面,更新發送訊息前插入的資料,但現在出現了插入的資料找不到的情況,而進入資料庫檢視插入的資料是存在的
@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)睡半秒,問題解決