转http://vvggsky.iteye.com/blog/438634
在第一阶段,交易中间件请求所有相关数据库准备提交(预提交)各自的事务分支,以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预提 交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来,并给交易中间件一个同意提交的应答,此时数据库将不能再在该事务 分支中加入任何操作,但此时数据库并没有真正提交该事务,数据库对共享资源的操作还未释放(处于锁定状态)。如果由于某种原因数据库无法提交属于自己的事 务分支,它将回滚自己的所有操作,释放对共享资源上的锁,并返回给交易中间件失败应答。
在第二阶段,交易中间件审查所有数据库返回的预提交结果,如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,这样该全局事务被提交。而如果有任一数据库预提交返回失败,交易中间件将要求所有其它数据库回滚其操作,这样该全局事务被回滚。
伪代码:
假设有两个Connection, con1, con2, 大体的过程如下,
- con1 = XAResouce1.getConnection...
- con2 = XAResouce2.getConnection...
- con1 do some thing.
- con2 do some thing.
- after they finish.
- pre1 = XAResouce1.prepare();
- pre2 = XAResouce2.prepare();
- if ( both pre1 and pre2 are OK){
- XAResouce1 and 2 commit
- }else {
- XAResouce1 and 2 rollback
- }