JTA事务的简单理解

huangliang00 2010-08-31

JTA的简单理解

1.Transaction分两种,LocalTransaction和GlobalTransaction。

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

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

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

importjavax.sql.XAConnection;

importjavax.transaction.xa.Xid;

importjavax.transaction.xa.XAResource;

importjavax.transaction.xa.XAException;

importjavax.transaction.Transaction;

importjavax.transaction.TransactionManager;

其中的

javax.sql.XAConnection;

javax.transaction.xa.Xid;

javax.transaction.xa.XAResource;

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

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

Oracle,Sybase,DB2,SQLServer等大型数据库才支持XA,支持GlobalTransaction。

MySQL连LocalTransaction都支持不好,更别说GlobalTransation了。

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

假设有两个Connection,con1,con2,大体的过程如下,

con1=XAResouce1.getConnection...

con2=XAResouce2.getConnection...

con1dosomething.

con2dosomething.

aftertheyfinish.

pre1=XAResouce1.prepare();

pre2=XAResouce2.prepare();

if(bothpre1andpre2areOK){

XAResouce1and2commit

}else{

XAResouce1and2rollback

}

前面有人讲了,在XAResouce1and2commit的时候,

可能XAResouce1commit()成功了,XAResouce2commit()失败了。

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

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

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

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

比如Tyrex。或JBoss等EJBServer的Transaction实现代码.

相关推荐