2022-11-08
成功新增資料到資料庫後,馬上查詢卻查不到 MSDTC latency
情境:程式裡面的實作,是先呼叫 domain 去資料庫新增資料,緊接著再馬上做查詢動作,但卻查不到剛才所新增的資料。
可能原因一
程式裡面有使用分散式交易(MSDTC)。
經臨床實驗證明,如果有使用 MSTDC,程式裡面即使已呼叫 transaction.commit,這也不代表資料會馬上落地到資料庫。
這個原因應該是因為 MSDTC 有它自己處理「交易」時要做的事,所以程式就算已經 commit(呼叫方已經收到 return),這時後馬上去查詢剛才所新增的資料也不一定會馬上有。
可能原因二
資料庫有實作讀寫分離。
資料落地後要同步到 standby 也是需要時間,不管做得再快(就算只有毫秒差),都會需要一點時間。
所以這時後程式一呼叫完寫入的方法,並且就馬上進 standby db 查的話,就有可能查詢不到。
可能解法一
如果在程式的設計上沒有到非常講究,可以在呼叫新增資料的方法(或著是 procedure)內,再多回傳所需要的資料。
但為什麼會說「講究」這個字,是因為有些設計的模式,並不建議在新增的動作中,又再回傳資料。例:CQRS。
可能解法二
如果呼叫方在呼叫完後沒有得到錯誤,並且在商業邏輯的部份也預期這就算是順利新增完資料的話,可以再多實做「重試」的機制。