從如何保證事務到如何保證分布式事務
- 事務特性
- 本地事務如何保證
- 為什麼會産生分布式事務
- 分布式事務如何保證
-
- XA協定如何保證
- TCC協定如何保證
- XA和TCC的差別
- Saga協定如何保證
- 基于事務消息
- 基于本地消息
- 分布式事務中間件 Seata
- 參考資源
事務特性
保證事務就是需要保證能實作這些事務特性
- 原子性
- 一緻性
- 隔離性
- 持久性
本地事務如何保證
為什麼會産生分布式事務
分布式事務如何保證
XA協定如何保證
- prepare和commit兩階段保證原子性
- 第一階段中RM逾時,按失敗處理,對所有RM執行復原
- 第二階段中RM逾時,持續對逾時RM重複發送指令
TCC協定如何保證
XA和TCC的差別
- XA的思想是在資源管理層面将多個本地事務連通為一個全局事務
- 事務過程中會一直持有資源的鎖,當RM過多時,系統吞吐量明顯下降
- TM為單機,會有單點故障的問題
- TCC的核心思想是為資源預留中間态,比如當機金額,提早釋放資源的鎖定,是以不會長時間持有資源的鎖,擁有更高的吞吐量
- TCC在業務層面實作,是以對業務有較大的侵入
- 考慮到網絡通信的原因,要求業務接口滿足三點:允許空復原,保持幂等性,防止資源懸挂
Saga協定如何保證
- 基于事務鍊的補償性事務
- 事務鍊中的每一個事務通過提供一個逆向事務來補償
- 當其中一個事務失敗時,便沿着事務鍊進行逆向補償,若補償失敗則一直重試
- 不保證事務隔離性,需要從業務上去規避
- 由于是一階段送出,不存在對資源的長時間加鎖,是以性能和吞吐量都非常高
基于事務消息
- 事務消息和本地消息要解決的核心問題都是本地事務與消息發送的一緻性問題
- RocketMQ是目前為數不多能夠支援事務消息的MQ
- 基于兩階段送出和定時任務回查
基于本地消息
- 消息記錄在資料庫中,通過定時任務掃描出待發送的記錄交MQ
分布式事務中間件 Seata
- 支援TCC和Saga兩種協定
- 針對TCC提供了一種業務侵入度為0的模式:AT(Automatic Transaction)
- AT模式的實作通過對SQL的執行進行代理和攔截,記錄SQL執行前後的資料快照,記錄在單獨的表中,confirm則删除快照,cancel則通過快照進行恢複
參考資源
阿裡雲社群:如何選擇分布式事務解決方案?