第一次發博文,略緊張。。。
核心:系統冪等性,記一個操作在系統中重復執行的結果是一樣的。
場景:A賬戶轉賬給B賬戶1000塊,A賬戶和B賬戶屬於兩個系統System-A和System-B
1. System-A本地事務
a. 開始本地事務
b. A賬戶扣款1000
c. 寫入消息表
d. 完成本地事務
2. 中間消息系統
a. 讀取System-A中的未應用的消息
b. 將消息發往System-B
3. System-B本地事務
a. 判斷消息是否已經應用
b. 若沒有
i. 開始本地事務
ii. B賬戶增加1000
iii. 寫入消息應用表
iv. 完成本地事物
c. 若有
i. 忽略消息
d. 將應用消息發往System-A
4. 中間消息系統
a. 將System-A的消息狀態更新
幾種異常情況:
1. System-A本地事務階段失敗
a. System-A本地事務回滾
2. 中間消息系統
a. 讀取System-A中的未應用的消息(掛掉),消息不會發送
b. 將消息發往System-B發出之后掛掉
i. System-B已經將事務執行,同時System-B接收到同樣的消息,會忽略
3. System-B本地事務階段失敗
a. 事務成功消息不會寫入消息應用表
b. 若需要補償,則向本地消息表中添加一條失敗消息,由System-A進行補償
4. 中間消息系統更新狀態失敗
a. 更新失敗,消息將會重復發送
幾種經典的分布式事務解決方案: