JTA事务总结(一)

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

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

测试代码片段:

public void doTest()throws Exception{
        UserTransaction tx = null;
        try{
                Context ctx = new InitialContext();
                tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");                 
                tx.begin();

                doResource1();                
                doResource2();                  
               
                tx.commit();           
            }catch(Exception e){
                e.printStackTrace();
                if(tx != null){
                    tx.rollback();
                }
            }
    }

    private void doResource1()throws Exception{
            ...
            DataSource ds = (DataSource) ctx.lookup("A|B|C|D|E");                          
            con = ds.getConnection();    
            ...
    }

    private void doResource2()throws Exception{
            ...
            DataSource ds = (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]:在允许Emulate Two-Phase Commit for non-XA Driver的情况下成功,否则失败
[C-C]:运行成功,但是不像(A-A)的情况,两次获得con的对象不是同一个对象,weblogic并为对该情况进行优化
[C-D]:运行成功,这是典型的2PC(two-phase transaction commit process)用于分布式多资源的应用情况

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

猜你喜欢

转载自wokeke.iteye.com/blog/1142950