您的位置:首页 > 其它

JTA和两阶段提交,处理全局事务

2012-09-17 09:59 260 查看
1. Transaction 分两种,Local Transaction 和 Global Transaction。

涉及到一个Connection的Commit,称为Local Transaction。

涉及到多个Connection的Commit,称为Global Transaction。

楼主提到的是,Global Transaction.

2. Global Transaction 需要XA接口(包括在JTA里面)的支持。

import javax.sql.XAConnection;

import javax.transaction.xa.Xid;

import javax.transaction.xa.XAResource;

import javax.transaction.xa.XAException;

import javax.transaction.Transaction;

import javax.transaction.TransactionManager;

其中的

javax.sql.XAConnection;

javax.transaction.xa.Xid;

javax.transaction.xa.XAResource;

这些XA接口的实现,需要数据库的JDBC提供。

数据库本身要支持XA。数据库的JDBC也要提供XA的实现。

Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持Global Transaction。

My SQL 连Local Transaction都支持不好,更别说Global Transation了。

3. XA需要两阶段提交 -- prepare 和 commit.

假设有两个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

}

前面有人讲了,在XAResouce1 and 2 commit的时候,

可能XAResouce1 commit() 成功了,XAResouce2 commit()失败了。

这时候,会抛出一个 “启发式异常”。程序可以处理这个异常。比如,XAResouce.recover()之类。

但一般情况下,还真没别的办法,需要数据管理员根据数据操作日志 undo所有的操作,或者恢复数据备份。

有的数据库在进行数据操作的时候,会生成一个“反操作”日志。比如,insert 对 delete, 等。

4. TransactionManager的实现能够处理多个XAResouce(一个XAResouce list)的情况。

比如Tyrex。或JBoss等EJB Server的Transaction实现代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: