MySQL/MariaDB對分布式事務(wù)的支持是根據(jù) X/Open CAE document Distributed Transaction Processing: The XA Specification (http://www.opengroup.org/public/pubs/catalog/c193.htm) ,主要包括下面這幾個語句:
xa start 'gtid'; //開始一個全局事務(wù)
xa end 'gtid'; //結(jié)束一個全局事務(wù)
xa prepare 'gtid'; //準備完成一個事務(wù)
xa commit 'gtid'; //提交
xa rollback 'gtid'; //回滾
xa recover; //恢復(fù)
例子:
mysql> xa start 'ax2';
Query OK, 0 rows affected (0.04 秒)
mysql> update user set name = '敖翔' where userid = 11;
Query OK, 1 rows affected (0.03 秒)
mysql> xa end 'ax2';
Query OK, 0 rows affected (0.05 秒)
mysql> xa prepare 'ax2';
Query OK, 0 rows affected (0.04 秒)
mysql> xa recover;
+----------+--------------+--------------+------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+------+
| 1 | 3 | 0 | ax2 |
+----------+--------------+--------------+------+
1 行于數(shù)據(jù)集 (0.08 秒)
mysql> xa rollback 'ax2';
Query OK, 0 rows affected (0.03 秒)
如果XA事務(wù)達到PREPARED狀態(tài)而且MySQL服務(wù)器宕機,當服務(wù)器重啟后,能夠繼續(xù)處理事務(wù)。就像原本應(yīng)當?shù)哪菢?。但是,如果客戶端連接中止而服務(wù)器繼續(xù)運行,服務(wù)器將回滾任何未完成的XA事務(wù),即使該事務(wù)已達到PREPARED狀態(tài)也同樣。它應(yīng)能提交或回滾PREPARED XA事務(wù),但在不更改二進制日志機制的情況下不能這樣。
1、不是prepare狀態(tài)的事務(wù)在重連后將無法恢復(fù)
mysql> xa start 'ax2';
Query OK, 0 rows affected (0.02 sec)
Database changed
mysql> update user set name ="敖翔" where userid=11;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> xa end 'ax2';
Query OK, 0 rows affected (0.03 sec)
mysql> quit;
Bye
mysql> xa recover;
Empty set (0.02 sec)
2、prepare狀態(tài)的事務(wù)在重連后將可恢復(fù)
mysql> xa start 'ax2';
Query OK, 0 rows affected (0.03 sec)
mysql> update user set name ="敖翔" where userid=11;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> xa end 'ax2';
Query OK, 0 rows affected (0.02 sec)
mysql> xa prepare 'ax2';
Query OK, 0 rows affected (0.03 sec)
mysql> quit;
Bye
mysql> xa recover;
+----------+--------------+--------------+------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+------+
| 1 | 3 | 0 | ax2 |
+----------+--------------+--------------+------+
1 row in set (0.03 sec)
后續(xù)將根據(jù)mysql ?xa機制實現(xiàn)dubbo分布式事務(wù)。