语句:
XA {START|BEGIN} xid
XA END xid
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER
XA START xid | XA BEGIN xid
开始一个事务,并将事务置于ACTIVE状态,此后执行的SQL语句都将置于该事务中。
XA END xid
将事务置于IDLE状态,表示事务内SQL操作完成。
后续事务操作可以使XA PREPARE xid 或 XA COMMIT xid ONE PHASE.
XA PREPARE xid
实现事务提交的准备工作,事务状态置于PREPARED状态。
事务如果无法提交,该语句将会失败。
此后可执行XC COMMIT和XA ROLLBACK
XA COMMIT xid
事务最终提交,完成持久化,事务完成。
XA COMMIT xid ONE PHASE
在XA END后执行,该语句一并包含XA PREPARE和XA COMMIT。
XA ROLLBACK xid
事务回滚并终止。
示例程序:
1 // 分别创建指向两个数据库的连接,并各自创建相应的表,DDL语句不能在事务过程中执行。 2 create_connection1(&_G_connect1); 3 create_connection2(&_G_connect2); 4 create_table_member(&_G_connect1); 5 create_table_member(&_G_connect2); 6 // 两个数据库分别创建两个分布式事务 7 _G_connect1.direct_exec("xa begin 'xa-trans'"); 8 _G_connect2.direct_exec("xa start 'xa-trans'"); 9 // 向两个库表中分别写入数据 10 insert_record_direct(&_G_connect1); 11 insert_record_direct(&_G_connect2); 12 // SQL操作完成 13 _G_connect1.direct_exec("xa end 'xa-trans'"); 14 _G_connect2.direct_exec("xa end 'xa-trans'"); 15 // 事务准备提交 16 _G_connect1.direct_exec("xa prepare 'xa-trans'"); 17 _G_connect2.direct_exec("xa prepare 'xa-trans'"); 18 // 事务最终提交 19 _G_connect1.direct_exec("xa commit 'xa-trans'"); 20 _G_connect2.direct_exec("xa commit 'xa-trans'"); 21 22 // 如某个数据库准备提交失败,则可以事务回滚 23 //_G_connect1.direct_exec("xa rollback 'xa-trans'"); 24 //_G_connect1.direct_exec("xa rollback 'xa-trans'"); 25 26 // xa prepare和xa commit,可以使用xa commit one phase一条语句完成 27 _G_connect1.direct_exec("xa commit 'xa-trans' one phase"); 28 _G_connect2.direct_exec("xa commit 'xa-trans' one phase");