準備
innodb存儲引擎開啟支持分布式事務
set global innodb_support_ax=on
MySQL數據庫XA事務的SQL語法如下:
XA {START| BEGIN} xid {JOIN | RESUME}
XA END xid {SUSPEND [ FOR MIGRATE]}
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER
完整```groovy
xa start gtrid, bqual, formatId;
xa end gtrid, bqual, formatId;
xa prepare gtrid, bqual, formatId;
xa commit gtrid, bqual, formatId;
bqual: 默認為空
formatId:默認為1
xa start 'a';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'a';
xa prepare 'a';
xa recover;
xa commit 'a';
1. XA START 'a';
- 作用:開始一個新的XA事務,并分配一個唯一的事務ID
'a'
。 - 說明:在這個命令之后,所有后續的SQL操作都會被包含在這個XA事務中,直到遇到
XA END
命令。
2. insert into z(
a,
b,
c) select 100,2,100;
- 作用:執行一條插入語句,將值
(100, 2, 100)
插入到表z
中。 - 說明:這條語句是在XA事務上下文中執行的,這意味著如果最終XA事務沒有成功提交,這個插入操作也不會對數據庫產生實際影響。
3. XA END 'a';
- 作用:標記XA事務
'a'
的操作結束。 - 說明:這并不意味著事務已經完成或提交,它只是表明當前事務不再接受新的操作。在
XA END
之后,不能再對該事務進行任何修改操作。
4. XA PREPARE 'a';
- 作用:準備XA事務
'a'
,使其進入預備狀態。 - 說明:這是兩階段提交(2PC, Two-Phase Commit)的第一階段。在這個階段,所有參與的資源管理器會投票決定是否可以安全地提交該事務。如果所有參與者都準備好提交,則可以進入下一階段;如果有任何一個參與者不能準備好,則整個事務會被回滾。
5. XA RECOVER;
- 作用:列出所有處于預備狀態但尚未完成提交或回滾的XA事務。
- 說明:這個命令對于恢復未完成的XA事務非常有用,特別是在系統崩潰后需要手動干預來解決懸掛事務時。
6. XA COMMIT 'a';
- 作用:提交XA事務
'a'
。 - 說明:這是兩階段提交的第二階段。只有當所有參與的資源管理器都已準備好(通過
XA PREPARE
),并且沒有任何錯誤發生時,才會執行此命令。提交后,所有更改將永久保存到數據庫中。
當如下代碼:
xa start 'a';insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'a';
xa prepare 'a';
//不進行提交xa commit 'a';
可看懸掛的分布式事物列表:
xa recover;
- gtrid_length: gtrid字符的長度,按字節計算。
- bqual_length: bqual字符的長度,按字節計算。
提交或者回滾的方式:
xa commit 'a'xa rollback 'a'
改變gtrid長度
xa start 'aaa';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa';
xa prepare 'aaa';
提交或者回滾的方式:
xa commit 'aaa'
xa rollback'aaa'
改變gtrid長度和bqual長度
xa start 'aaa','bbb';
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa','bbb';
xa prepare 'aaa','bbb';
提交或者回滾的方式:
xa commit 'aaa','bbbb'xa rollback'aaa','bbbb'
改變gtrid長度、bqual長度、formatId值
xa start 'aaa','bbb', 100;
insert into z(`a`,`b`,`c`) select 100,2,100
xa end 'aaa','bbb', 100;
xa prepare 'aaa','bbb', 100
提交的方式:
提交或者回滾的方式:
xa commit 'aaa','bbbb',100xa rollback'aaa','bbbb',100
總結
這段腳本演示了一個完整的XA事務流程:
- 開始一個新的XA事務。
- 執行一些數據庫操作(在這里是一個插入操作)。
- 結束XA事務的操作部分。
- 準備XA事務以供提交。
- 檢查是否有任何未完成的XA事務(雖然在這個例子中看起來不太必要,但在實際應用中可用于故障恢復)。
- 最終提交XA事務,使所有更改生效。
這種機制特別適用于需要跨多個數據庫或其他資源管理器保持一致性的場景,例如銀行轉賬、電子商務訂單處理等。然而,XA事務也有其局限性,比如性能開銷較大,因為它涉及到更多的協調步驟,并且可能會導致阻塞問題。因此,在設計系統時需要權衡使用XA事務的成本與收益。
java實現分布式事務代碼實例