JTA事务总结(一)

自:http://blog.sina.com.cn/s/blog_661a3fce0100mshi.html

今天在weblogic在对几种JTA的应用场景进行了测试,总结如下:

测试代码片段:

publicvoiddoTest()throwsException{

UserTransactiontx=null;

try{

Contextctx=newInitialContext();

tx=(UserTransaction)ctx.lookup("javax.transaction.UserTransaction");

tx.begin();

doResource1();

doResource2();

tx.commit();

}catch(Exceptione){

e.printStackTrace();

if(tx!=null){

tx.rollback();

}

}

}

privatevoiddoResource1()throwsException{

...

DataSourceds=(DataSource)ctx.lookup("A|B|C|D|E");

con=ds.getConnection();

...

}

privatevoiddoResource2()throwsException{

...

DataSourceds=(DataSource)ctx.lookup("A|B|C|D|E");

con=ds.getConnection();

...

}

共创建了五个连接池以及对应的数据源

A:OracleLocalDataSource

B:OracleLocalDataSource2

C:OracleXADataSource

D:OracleXADataSource2

E:MysqlLocalDataSource

A、B:【oracle.jdbc.driver.OracleDriver】

C、D:【oracle.jdbc.xa.client.OracleXADataSource】

E:【org.gjt.mm.mysql.Driver】

Mysql没有支持分布式的XA驱动程序

对于doResource1和doResource2所用不同数据源类型搭配测试情况如下:

[A-A]:运行成功,且weblogic进行了优化,两次操作获得的con其实是同一个连接对象

[A-B]:运行失败,不允许在一次事务中从不同的数据库获取local事务类型的连接

[A-E]:运行失败,不允许在一次事务中从不同的数据库获取local事务类型的连接

[A-D]:在允许EmulateTwo-PhaseCommitfornon-XADriver的情况下成功,否则失败

[C-C]:运行成功,但是不像(A-A)的情况,两次获得con的对象不是同一个对象,weblogic并为对该情况进行优化

[C-D]:运行成功,这是典型的2PC(two-phasetransactioncommitprocess)用于分布式多资源的应用情况

对于C、D的XA类型驱动程序,weblogic默认不允许通过con.setAutoCommit(false)的方式进行事务启动,可以通过允许(SupportsLocalTransaction)选项启动本地事务。

相关推荐