解決分布式事務中資料不一致性導致業務異常

2021-09-26 15:09:21 字數 869 閱讀 2920

第三方電商抓取訂單後需要把訂單下傳到倉庫,這樣倉庫那邊才能正常發貨。

第三方電商取消訂單後;如果當前訂單已經下傳倉庫,則需要向倉庫發起訂單攔截指令;如果沒有下傳倉庫,則直接取消訂單。

業務異常:訂單取消成功但倉庫卻把訂單中的商品傳送了出去

第三方電商對應的服務為:xdt.service

下傳倉庫服務為:dip.service

專案採用dubbo分布式架構

訂單下傳流轉圖

定單取消流轉圖

訂單下傳呼叫dip.service服務出現介面服務呼叫超時,可能導致在dip下傳成功的訂單在xdt中狀態仍然為8002等待攔截。

此時如果第三方電商取消這個訂單,這個訂單會被直接取消,不會通知倉庫進行攔截。

方案1:取消訂單的時候如果訂單狀態為8002,再去dip那邊查詢訂單是否下傳成功。如下為偽**實現:

void cancalorder(string orderid)}}

這個是我最初的解決方案,最終發現這個方案不可行。假如dip查詢訂單的t1時刻訂單不存在,t2時刻訂單就下傳成功了,t3時刻訂單就會被直接取消。(t1方案二:考慮把訂單狀態與訂單下傳狀態區分開,執行訂單下傳操作都會去改變訂單的狀態,呼叫dip.service返回成功才會去修改訂單下傳狀態。如下為系統流轉圖:

資料庫 資料不一致性

3種資料不一致性 1 丟失修改 lost update 兩個事務t1和t2讀入同一資料並修改,t2提交結果破壞了t1提交的結果,到這t1的修改被丟失。2 不可重複讀 non repeatable read 不可重複讀是指事務t1讀取資料後,事務t2執行修改操作,使t1無法再現前一次讀取的結果 3 讀...

Redis 和 MySQL 資料不一致性

date 2020 11 25 15 16 00 updated 2020 11 25 15 55 00 參考位址 具體如何去解決還得結合業務去綜合考慮。下面幾個方式可能比較通用 寫流程先刪除快取 寫更新資料庫 再次刪除快取 避免在第二步的時候有讀請求訪問資料庫,然後把舊的值寫入到快取中 讀流程先讀...

解決併發所帶來的資料不一致性

測試前提,linux伺服器 因為windows伺服器下 nginx php是fashcgi方式,預設是單程序單執行緒的,所有的併發請求都要排隊處理,所以在windows伺服器下測試時沒有任何效果的。這段 的邏輯很簡單,類似於商品庫存一樣,stock為庫存,count為購買數量,每購買一次 count...