在使用spring事務時,我們通常會把事務內的所有操作當成是一個原子操作。也就是當整個事務內的所有代碼都執行完成后, 才會將所有的數據落實到數據庫中。這樣做有時也會給我們造成麻煩。比如以下場景:
根據圖中描述的邏輯,如果我們把前兩步封裝到一個事務方法中,會造成當第三方服務回調我們服務時,我們根據id去查詢記錄時,發現記錄不存在。
這說明,我們第一步執行的方法並沒有生效。原因就是因為第1步和第2步同時存在於一個事務中,所以當執行第二步時, 數據庫並沒有生效,而此時,
第三方服務如果處理比較快的時候,會立即回調我們,造成我們庫里面查不到數據的情況。
解決方案:我們可以讓第二步在第一步完全執行完成之后再去執行,這個時候就需要用到事務后提交操作。
demo:
在事務方法中寫入如下代碼:decisionService.restdecision(bestbuyOrder);就是我們圖中所說的步驟2.這樣就可以保證在步驟1完全入庫后再執行步驟2.這樣再查詢就不會出現查不到的情況了。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { decisionService.restdecision(bestbuyOrder); } });