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)选项启动本地事务。