最早的分布式事務模型是 X/Open 國際聯盟提出的 X/Open Distributed Transaction Processing(DTP)模型,也就是大家常說的 X/Open XA 協議,簡稱 XA 協議

DTP 模型中包含一個全局事務管理器(TM,Transaction Manager)和多個資源管理器(RM,Resource Manager)。全局事務管理器負責管理全局事務狀態與參與的資源,協同資源一起提交或回滾;資源管理器則負責具體的資源操作。
XA 協議描述了 TM 與 RM 之間的接口,允許多個資源在同一分布式事務中訪問
基于 DTP 模型的分布式事務流程大致如下:

1.應用程序(AP,Application)向 TM 申請開始一個全局事務。
2.針對要操作的 RM,AP 會先向 TM 注冊(TM 負責記錄 AP 操作過哪些 RM,即分支事務),TM 通過 XA 接口函數通知相應 RM 開啟分布式事務的子事務,接著 AP 就可以對該 RM 管理的資源進行操作。
3.當 AP 對所有 RM 操作完畢后,AP 根據執行情況通知 TM 提交或回滾該全局事務,TM 通過 XA 接口函數通知各 RM 完成操作。TM 會先要求各個 RM 做預提交,所有 RM 返回成功后,再要求各 RM 做正式提交,XA 協議要求,一旦 RM 預提交成功,則后續的正式提交也必須能成功;如果任意一個 RM 預提交失敗,則 TM 通知各 RM 回滾。
4.所有 RM 提交或回滾完成后,全局事務結束
** 原子性**
XA 協議使用 2PC(Two Phase Commit,兩階段提交)原子提交協議來保證分布式事務原子性。
兩階段提交是指將提交過程分為兩個階段,即準備階段(投票階段)和提交階段(執行階段):

準備階段:
TM 向每個 RM 發送準備消息。如果 RM 的本地事務操作執行成功,則返回成功;如果 RM 的本地事務操作執行失敗,則返回失敗。
提交階段
如果 TM 收到了所有 RM 回復的成功消息,則向每個 RM 發送提交消息;否則發送回滾消息;RM 根據 TM 的指令執行提交或者回滾本地事務操作,釋放所有事務處理過程中使用的鎖資源
**隔離性**
XA 協議中沒有描述如何實現分布式事務的隔離性,但是 XA 協議要求 DTP 模型中的每個 RM 都要實現本地事務,也就是說,基于 XA 協議實現的分布式事務的隔離性是由每個 RM 本地事務的隔離性來保證的,當一個分布式事務的所有子事務都是隔離的,那么這個分布式事務天然的就實現了隔離性。
以 MySQL 來舉例,MySQL 使用 2PL(Two-Phase Locking,兩階段鎖)機制來控制本地事務的并發,保證隔離性。2PL 與 2PC 類似,也是將鎖操作分為加鎖和解鎖兩個階段,并且保證兩個階段完全不相交。加鎖階段,只加鎖,不放鎖。解鎖階段,只放鎖,不加鎖

如上圖所示,在一個本地事務中,每執行一條更新操作之前,都會先獲取對應的鎖資源,只有獲取鎖資源成功才會執行該操作,并且一旦獲取了鎖資源就會持有該鎖資源直到本事務執行結束。
MySQL 通過這種 2PL 機制,可以保證在本地事務執行過程中,其他并發事務不能操作相同資源,從而實現了事務隔離
**一致性**
前面提到一致性有兩層語義,一層是確保事務執行結束后,數據庫從一個一致狀態轉變為另一個一致狀態。另一層語義是事務執行過程中的中間狀態不能被觀察到。
前一層語義的實現很簡單,通過原子性、隔離性以及 RM 自身一致性的實現就可以保證。至于后一層語義,我們先來看看單個 RM 上的本地事務是怎么實現的。還是以 MySQL 舉例,MySQL 通過 MVCC(Multi Version Concurrency Control,多版本并發控制)機制,為每個一致性狀態生成快照(Snapshot),每個事務看到的都是各 Snapshot 對應的一致性狀態,從而也就保證了本地事務的中間狀態不會被觀察到。
雖然單個 RM 上實現了 Snapshot,但是在分布式應用架構下,會遇到什么問題呢?

如上圖所示,在 RM1 的本地子事務提交完畢到 RM2 的本地子事務提交完畢之間,只能讀到 RM1 上子事務執行的內容,讀不到 RM2 上的子事務。也就是說,雖然在單個 RM 上的本地事務是一致的,但是從全局來看,一個全局事務執行過程的中間狀態被觀察到了,全局一致性就被破壞了。
XA 協議并沒有定義怎么實現全局的 Snapshot,像 MySQL 官方文檔里就建議使用串行化的隔離級別來保證分布式事務一致性: “As with nondistributed transactions, SERIALIZABLE may be preferred if your applications are sensitive to read phenomena. REPEATABLE READ may not be sufficient for distributed transactions.”(對于分布式事務來說,可重復讀隔離級別不足以保證事務一致性,如果你的程序有全局一致性讀要求,可以考慮串行化隔離級別.)
當然,由于串行化隔離級別的性能較差,所以很多分布式數據庫都自己實現了分布式 MVCC 機制來提供全局的一致性讀。一個基本思路是用一個集中式或者邏輯上單調遞增的東西來控制生成全局 Snapshot,每個事務或者每條 SQL 執行時都去獲取一次,從而實現不同隔離級別下的一致性。比如 Google 的 Spanner 就是用 TrueTime 來控制訪問全局 Snapshot
XA 協議是 X/Open 提出的分布式事務處理標準。文中提到的 2PC、3PC、TCC、本地事務表、Seata in AT mode,無論哪一種,本質都是事務協調者協調各個事務參與者的本地事務的進度,使使所有本地事務共同提交或回滾,最終達成一種全局的 ACID 特性。在協調的過程中,協調者需要收集各個本地事務的當前狀態,并根據這些狀態發出下一階段的操作指令。這個思想就是 XA 協議的要義,我們可以說這些事務模型遵守或大致遵守了 XA 協議
### 優缺點
XA 協議通常實現在數據庫資源層,直接作用于資源管理器上。因此,基于 XA 協議實現的分布式事務產品,無論是分布式數據庫,還是分布式事務框架,對業務幾乎都沒有侵入,就像使用普通數據庫一樣。
XA 協議嚴格保障事務 ACID 特性,能夠滿足所有業務領域的功能需求,但是,這同樣是一把雙刃劍。
由于隔離性的互斥要求,在事務執行過程中,所有的資源都被鎖定,只適用于執行時間確定的短事務。同時,整個事務期間都是獨占數據,對于熱點數據的并發性能可能會很低,實現了分布式 MVCC 或樂觀鎖(optimistic locking)以后,性能可能會有所提升。
同時,為了保障一致性,要求所有 RM 同等可信、可靠,要求故障恢復機制可靠、快速,在網絡故障隔離的情況下,服務基本不可用
- 概述
- CAP理論
- BASE理論
- ACID
- 分布式系統相關技術
- 主流數據庫連接池
- 基礎
- 系統單點
- 負載均衡
- HTTP重定向負載均衡
- DNS域名解析負載均衡
- 反向代理負載均衡
- IP負載均衡
- 數據鏈路層負載均衡
- 負載均衡算法
- 輪詢法(Round Robin)
- 加權輪詢(Weight Round Robin)
- 隨機算法(Random)
- 源地址Hash算法
- 加權隨機法(Weight Random)
- 最小連接數法(Least Connections)
- 接入層負載均衡
- 軟件架構
- 性能
- 性能測試指標
- 響應時間
- 并發數
- 吞吐量
- 性能計數器
- 性能測試方法
- 性能測試報告
- 性能優化
- Web前端性能優化
- 應用服務器性能優化
- 可用性
- 服務降級
- 伸縮性
- 擴展性
- 事件驅動架構
- 安全性
- 信息加密技術
- 分布式系統概述
- 自動化
- 分布式唯一ID
- 冪等設計
- 分布式鎖
- 腦裂
- 一致性原理
- Paxos
- Zab
- Raft
- 分布式遠程服務調用
- RMI
- Spring RMI
- WebService
- SOA服務架構
- 微服務架構
- 微服務的九大特性
- 服務注冊和發現
- 解決方案及組件
- 分布式網關
- 注冊中心
- Zookeeper
- ZNode
- Watch接口
- 持久節點-配置中心實現原理
- 臨時節點-注冊中心
- Zookeeper選舉
- Zookeeper角色
- ZooKeeper工作原理
- 選主流程
- 同步流程
- Leader工作流程
- Follower工作流程
- 常見限流算法
- 計數器算法
- 漏桶算法
- 令牌桶算法
- 滑動窗口
- 計數器&滑動窗口
- 斷路器
- 大流量高并發高可用
- 高可用
- 高并發/大流量
- 分布式緩存系統
- 基本概念
- 緩存命中率
- 緩存最大元素
- 緩存回收策略
- 回收算法
- 緩存穿透與緩存雪崩
- CDN緩存
- 緩存分類
- memcached
- 客戶端路由原理
- 內存管理機制
- Redis
- Redis數據模型
- redisObject/Redis type/Redis encoding
- 命令的類型檢查和多態
- skiplist跳躍表
- 為什么使用跳躍表
- redis-內存管理機制
- Redis淘汰策略
- Redis持久化策略
- Redis并發競爭
- redis主從復制
- Redis集群實現方案
- Redis Cluster
- redis事務
- Redis-Sentinel
- Redis適用場景
- Redis客戶端
- redis rehash原理
- dict數據結構
- 觸發rehash的條件
- 漸進式rehash
- 漸進式rehash過程
- Redis多線程版本
- 緩存實際應用
- 堆緩存-Guava Cache
- 主要參數
- Caffeine
- Spring注解緩存
- 分布式存儲
- Database
- AUTOCOMMIT
- 臟讀&幻讀&不可重復讀
- 子查詢
- 連接
- 內連接
- 自連接
- 自然連接
- 外連接
- 組合查詢
- 隔離級別
- 數據庫范式
- 索引實現機制
- 數據庫拆分
- 表分區
- 分庫
- 分表
- MySQL
- MySQL基礎架構
- 鎖分類
- 排它鎖&獨占鎖
- 共享鎖
- 間隙鎖
- 表級鎖
- 存儲引擎
- 磁盤IO
- 磁盤結構圖
- 磁盤數據讀寫原理
- MySQL索引原理
- B+樹索引
- 局部性原理
- 索引數據結構
- 聯合索引
- 最左前綴匹配原則
- 建索引的幾大原則
- 數據文件和索引文件
- 執行計劃explain
- 常見問題
- 數據頁
- MYSQL單表存儲量計算
- 回表
- 索引覆蓋
- 索引下推
- 頁分裂和頁合并
- InnoDB
- innodb索引
- Innodb引擎的底層實現
- MyISAM
- MyISAM引擎的底層實現
- MVCC
- Next-Key Locks
- MySQL索引類型
- MYSQL復制
- 主從復制
- 讀寫分離
- MySQL Dual-Master
- 分庫分表實現方案
- MySQL事務實現原理
- MYSQL調優
- 性能優化
- HBase
- 不停機分庫分表遷移
- RDBMS&NoSQL
- 分布式事務
- 協議或事務模型
- X/Open XA協議
- 分布式事務編程接口規范JTA
- TCC模型
- 解決方案
- 兩階段提交2PC
- 三階段提交3PC
- Seata
- 分布式事務Seata產品模塊
- AT模式
- TCC模式
- Saga模式
- XA模式
- 基于消息中間件的最終一致性事務方案
- 消息隊列
- AMQP
- JMS
- ActiveMQ
- RabbitMQ
- RocketMQ
- RocketMQ基本概念
- 主要特性
- 分區順序消息
- 全局順序消息
- 消息可靠性
- 定時消息
- 消息重試
- 死信隊列
- 分布式事務消息
- RocketMQ架構
- Producer
- Consumer
- NameServer
- Broker
- RocketMQ設計
- 消息存儲
- 頁緩存與內存映射
- 消息刷盤
- 通信機制
- console控制臺
- RocketMQ部署架構
- Kafka
- Pulsar
- MQ消息重復消費與丟失
- 主流消息隊列比較
- 分布式調度系統
- 分布式搜索
- 分布式計算
- 架構案例
- 秒殺業務
- 秒殺整體架構
- 常見的監控系統
- 小米手機搶購秒殺方案
- 架構師領導藝術
- 架構師箴言
- 技術leader核心職責
- WEB服務器
- Servlet
- Servlet實現
- Servlet生命周期
- Servlet容器工作模式
- Servlet工作原理
- servlet線程安全
- CGI&FastCGI
- CGI
- FastCGI
- FastCGI與CGI特點
- CGI與Servlet比較
- HTTP Server
- Nginx
- Apache
- Nginx與Apache比較
- Application Server
- Tomcat
- Tomcat總體架構
- Connector
- 連接器核心功能
- ProtocolHandler
- EndPoint
- Processor
- Adapter
- Container
- 請求定位Servlet的過程
- Lifecycle生命周期
- Tomcat模塊設計
- Tomcat實例
- Tomcat運行原理
- spring & servlet
- Tomcat啟動流程
- Tomcat支持的I/O模型
- Tomcat應用層協議
- Tomcat類加載機制
- Tomcat類加載器
- Tomcat類加載器層次
- Apache+Tomcat
- 序列化
- XML&JSON
- JSON
- JAVA原生序列化
- hessian
- 常見中間件
- Canal
- Databus
- ELK日志套件
- 數據庫連接池
- spring狀態機
- 常見解決方案
- 二維碼掃碼登錄原理
- 前沿技術
- Saas服務
- 服務網格(Service Mesh)
- 云原生
- 常見面試問題
- Redis持久化的幾種方式
- Redis的緩存失效策略
- 附錄
- 二將軍問題
- 常見問題定位步驟
- 如何快速熟悉新系統
- 制定技術方案套路
- NUMA陷阱