语句:
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
事务回滚并终止。
示例程序:
// 分别创建指向两个数据库的连接,并各自创建相应的表,DDL语句不能在事务过程中执行。
create_connection1(&_G_connect1);
create_connection2(&_G_connect2);
create_table_member(&_G_connect1);
create_table_member(&_G_connect2);
// 两个数据库分别创建两个分布式事务
_G_connect1.direct_exec("xa begin 'xa-trans'");
_G_connect2.direct_exec("xa start 'xa-trans'");
// 向两个库表中分别写入数据
insert_record_direct(&_G_connect1);
insert_record_direct(&_G_connect2);
// SQL操作完成
_G_connect1.direct_exec("xa end 'xa-trans'");
_G_connect2.direct_exec("xa end 'xa-trans'");
// 事务准备提交
_G_connect1.direct_exec("xa prepare 'xa-trans'");
_G_connect2.direct_exec("xa prepare 'xa-trans'");
// 事务最终提交
_G_connect1.direct_exec("xa commit 'xa-trans'");
_G_connect2.direct_exec("xa commit 'xa-trans'");
// 如某个数据库准备提交失败,则可以事务回滚
//_G_connect1.direct_exec("xa rollback 'xa-trans'");
//_G_connect1.direct_exec("xa rollback 'xa-trans'");
// xa prepare和xa commit,可以使用xa commit one phase一条语句完成
_G_connect1.direct_exec("xa commit 'xa-trans' one phase");
_G_connect2.direct_exec("xa commit 'xa-trans' one phase");