關於MySQL XA 事務
MySQL XA 事務通常用於分佈式事務處理當中。比如在分庫分表的場景下,當遇到一個用戶事務跨了多個分區,需要使用XA事務 來完成整個事務的正確的提交和回滾,即保證全局事務的一致性。
XA 事務在分庫分表場景的使用
下圖是個典型的分庫分表場景,前端是一個Proxy後面帶若干個MySQL實例,每個實例是一個分區。
假設一個表test定義如下,Proxy根據主鍵”a”算Hash決定一條記錄應該分佈在哪個節點上:
create table test(a int primay key, b int) engine = innodb;
應用發到Proxy的一個事務如下:
begin;
insert into test values (1, 1);
update test set b = 1 where a = 10;
commit;
Proxy收到這個事務需要將它轉成XA事務發送到後端的數據庫以保證這個事務能夠安全的提交或回滾,一般的Proxy的處理步驟 如下:
- Proxy先收到begin,它只需要設置一下自己的狀態不需要向後端數據庫發送
- 當收到 insert 語句時Proxy會解析語句,根據“a”的值計算出該條記錄應該位於哪個節點上,這裏假設是“分庫1”
- Proxy就會向分庫1上發送語句xa start ‘xid1’,開啓一個XA事務,這裏xid1是Proxy自動生成的一個全局事務ID;同時原來 的insert語句insert in