XA(eXtended Architecture)是指由X/Open 組織提出的分布式交易處理的規范。XA 是一個分布式事務協議,由Tuxedo 提出,所以分布式事務也稱為XA 事務。XA 協議主要定義了事務管理器TM(Transaction Manager,協調者)和資源管理器RM(Resource Manager,參與者)之間的接口。其中,資源管理器往往由數據庫實現,如Oracle、DB2、MySQL,這些商業數據庫都實現了XA 接口,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA 事務是基於兩階段提交(Two-phaseCommit,2PC)協議實現的,可以保證數據的強一致性,許多分布式關系型數據管理系統都采用此協議來完成分布式。階段一為准備階段,即所有的參與者准備執行事務並鎖住需要的資源。當參與者Ready時,向TM 匯報自己已經准備好。階段二為提交階段。當TM 確認所有參與者都Ready 后,向所有參與者發送COMMIT 命令。
XA 事務允許不同數據庫的分布式事務,只要參與在全局事務中的每個結點都支持XA 事務。Oracle、MySQL 和SQL Server 都支持XA 事務。
XA 事務由一個或多個資源管理器(RM)、一個事務管理器(TM)和一個應用程序(ApplicationProgram)組成。
資源管理器:提供訪問事務資源的方法。通常一個數據庫就是一個資源管理器。
事務管理器:協調參與全局事務中的各個事務。需要和參與全局事務的所有資源管理器進行通信。
應用程序:定義事務的邊界。
XA 事務的缺點是性能不好,且無法滿足高並發場景。一個數據庫的事務和多個數據庫間的XA 事務性能會相差很多。因此,要盡量避免XA 事務,如可以將數據寫入本地,用高性能的消息系統分發數據,或使用數據庫復制等技術。只有在其他辦法都無法實現業務需求,且性能不是瓶頸時才使用XA。
mysql 單機
可以顯示執行一個xa事務
xa start 'xxxa';
sql ...
xa end;
上面語句完成xa事務定義
xa prepare 'xxxa'; --執行xa事務prepare 階段
xa recover; 可以顯示的所有xa prepare完成的xa事務。
xa commit 'xxxa'; --執行xa事務的commit階段。
xa prepare完成,代表所有修改操作已完成 包括buffer pool,redo,binary log都已寫完成。
xa commit階段會進行真正的提交,可以理解為給日志打上完成標記。
可以根據binlog解析來分析。 mysqlbinlog --binlogname |tail -500
單機的顯示xa事務可以理解為可以保證redo與binlog的原子性。
單機中的普通事務,在用戶發起commit之前,對事務中的語句會寫buffer pool與redo,但是不會寫binlog,是在用戶發出commit之后才會寫binlog。
單機中的普通事務,會使用引擎層內置的兩階段提交。
分布式集群中xa事務
可以理解為是根據單機顯示xa事務的來實現的。
xa prepare 做好所有的准備工作,commit之前會去驗證所有節點都已完成prepare,才會進入commit階段。這樣是為了保證事務節點間的原子性,在每個節點上要么都成功,要么都失敗。