一、前言
我們提交一個事務,里面有多條sql,mysql是如何管理事務的呢?是如何做到其中一條sql執行失敗,全部回滾的呢?
二、XA事務
XA協議是基於二階段提交的一個具體實現,也是分為Prepare和Commit兩個階段。
Prepare階段:TM(事務協調者)向所有RM(資源管理者)發送prepare指令,詢問是否可以執行,RM返回可執行或不可執行。
Commit階段:所有RM都返回可執行,則向所有RM發送commit指令。如果有一個RM返回不可執行,則向所有RM發送rollback指令。
三、MySQL如何實現 XA 規范
MySQL根據單機還是分布式集群分為內部XA和外部XA。
內部XA:也就是單機的情況下,binlog充當TM(事務協調者)的角色。一個事務過來,寫入redo log日志和undo log日志。事務提交時,同時寫入redo log和binlog,保證redo log和binlog一致。如果事務撤銷,則根據undo log進行撤銷。
外部XA:分布式集群的情況下,一般用數據庫代理層來充當TM的角色,實現對事務的支持。