`

JTA事务总结(三)

阅读更多
自:http://blog.sina.com.cn/s/blog_661a3fce0100msjv.html

今天对XA和非XA驱动进行了更进一步的研究,终于搞清了以前些模菱两可的问题。

通过测试得知,在JTA事务中(包括JDBC事务以及非事务环境下),应用程序操作的connection其实都是weblogic的包装类

[A、B]:

weblogic.jdbc.wrapper.JTSConnection_weblogic_jdbc_oracle_OracleConnection

[C、D]:

weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_weblogic_jdbcx_base_BaseConnectionWrapper

[E]:

weblogic.jdbc.wrapper.JTSConnection_com_mysql_jdbc_Connection



由于XA驱动实现了XAResource的接口,所以能参与完全的2PC协议,保证多资源参与的事务的原子操作。但是非XA驱动没有实现XAResource的接口的接口,无法完全参与2PC协议,所以在分布式事务(即JTA事务)中weblogic实现了非XA驱动的XAResource包装(wrapper),用来模拟(或者说欺骗TM^_^)两步提交,在...\bea\weblogic81\server\lib\weblogic.jar类包中,通过反编译weblogic.jdbc.wrapper.JTSConnection和weblogic.jdbc.wrapperJTSXAResourceImpl类得到如下代码片段:



JTSXAResourceImpl源码片段:
    public int prepare(Xid xid)throws XAException
    {
        if(!jtsConn.getEnable2PC())
            throw new XAException("JDBC driver does not support XA ... );
        else
            return 0;
    }

    public void commit(Xid xid, boolean flag)throws XAException
    {
        ...
        jtsConn.internalCommit();
        ...
    }
    public void rollback(Xid xid)throws XAException
    {
        ...
        jtsConn.internalRollback();
        ...
    }



JTSConnection源码片段:
    public synchronized void internalRollback() throws SQLException
    {
        ...
        connection.rollback();
        ...
        internalClose();
        ...
    }

    public void internalCommit() throws SQLException
    {
        ...
        connection.commit();
        ...
        internalClose();
        ...
    }



可知如果非XA驱动允许两步提交时(enableTwoPhaseCommit),当TransactionManager调用prepare时XAResource包装类只是简单的返回XA_OK(0),当TransactionManager调用commit或rollback时XAResource包装类将代理调用非XA驱动的JDBC connection的commit或rollback,所以如果在commit或rollback出现异常后,应用程序的数据将有可能处于不一致的状态(其实如果XA驱动在TM调用XAResource的commit或者rollback时出错,系统数据也会处于不一致的状态,不过出现这种情况的概率是微乎其微的,如果想搞三步、四步...提交的话,就会进入鸡生蛋、蛋生鸡的无休止讨论的问题了^_^)。



接下来让我们研究一下连接关闭的问题,细心的人也许早已发现JTA与JDBC的事务对于应用层的操作有点“自相矛盾”,JDBC的先获得con在setAutoCommit(false)启动事务,然后关闭con,在commit或者rollback事务,然而JTA的顺序正好相反,先tx.begin(),再获取con,然后关闭con,最后再tx.commit或者rollback。(这里有句话您看完一下内容后会认同的:For both non-XA and XA driver, you can close the connection after the distributed transaction is completed.)

当应用程序调用Connection.close时容器通过注册的ConnectionEventListener事件通知TransactionManager,以便TransactionManager结束Connection对应的XAResource对象的事务分支(end函数调用),对于XA驱动的连接此时在Connection.close之后即可将该连接返回XA连接池供其他业务使用。

所以JTA spec中的提示到:

A distributed transaction may still be active after a participating Connection object is closed. This is not true for local transactions。

但是对于非XA驱动调用Connection.close后的情况将有所有区别,由于XA驱动需要用connection进行最后的commit或rollback,所以应用程序调用Connection.close之后只是对与应用不能再使用包装的Connection,但容器并没有真正将连接返回连接池,而是在调用XAResource包装类的commit和rollback时,进而调用JTSConnection的internalCommit和internalRollback,最终再JTSConnection的这两个函数中internalClose将非XA的连接释放到连接池中。

所以weblogic的资料(http://edocs.bea.com/wls/docs60/faq/transactions.html)中说:
the number of active distributed transactions using the non-XA
connection pool is limited by the maximum capacity of the JDBC connection pool

When you use an XA driver, the connection management is more scalable. WLS does not hold on to the same physical XA connection until the transaction is committed or rolled back. In fact, in most cases, the XA connection as only held for the duration of a method invocation. WLS JDBC wrappers intercept all JDBC calls and enlist the XAResource associated with the XA connection on demand. When the method invocation returns to the caller, or when it makes another call to another server, WLS delists the XAResource associated with the XA connection.

WLS also returns the XA connection to the connection pool on delistment if there are no open result sets. Also, during commit processing, any XAResource object can be used to commit any number of distributed transactions in parallel. As a result, neither the number of active distributed transactions using the XA connection pool nor the number of concurrent commit/rollbacks is limited by the maximum capacity of the connection pool. Only the number of concurrent database access connections is limited by the maximum capacity of the connection pool.


对于以上XA驱动的con在关闭后,不必等待事务结束即释放回连接池的推论,我在weblogic上对oracle做了些好像没有效果,weblogic中有个 Keep XA Connection Till Transaction Complete 的选项我也没有选中啊。不知是我对JTA的理解有误,还是说与我用的数据库驱动或者是weblogic的实现有关,要是有谁测出了效果还请指点指点小弟。

最后请注意:除非将XA驱动的连接池设置允许【Supports Local Transaction】选项,否则在非事务的环境下对con进行的操作将抛出如下错误,甚至是getAutoCommit()操作
分享到:
评论

相关推荐

    Java中JDBC事务与JTA分布式事务总结与区别

    JTA事务通常与JNDI(Java Naming and Directory Interface)和XAResource接口一起工作,使得应用程序可以透明地访问和管理分布式事务。使用JTA事务时,开发者不再直接控制Connection的事务,而是由事务管理器(如...

    Spring+iBatis+JOTM实现JTA事务

    - **概述**:JOTM是Jakarta Object Transaction Manager的缩写,是一个开源的JTA事务管理器,能够在脱离J2EE容器的情况下实现分布式事务管理。 - **用途**:为不使用J2EE容器的应用程序提供事务管理服务。 #### ...

    JTA 分布式事务 XAPool 1.5和1.6的所有jar包,源码包

    同时,还需要考虑与JTA事务管理器(如Atomikos、Bitronix等)的集成,以实现完整的分布式事务处理。 总结来说,XAPool是JTA分布式事务处理的重要组件,提供了一种高效的数据库连接池解决方案,对于构建大规模、高...

    Spring+MyBatis+Atomikos实现JTA分布式事务

    Spring的PlatformTransactionManager接口定义了事务管理的基础方法,而AtomikosTransactionManager就是实现这个接口的一个实例,用于处理JTA事务。 MyBatis本身不支持JTA,但可以通过集成Spring来实现。在Spring...

    Java事务处理总结[归类].pdf

    2. JTA事务提供了一种更高级别的、与实现和协议无关的API,允许应用程序执行分布式事务,涉及多个网络资源和数据库。JTA支持通过实现`javax.sql.XADataSource`、`javax.sql.XAConnection`和`javax.sql.XAResource`...

    跨数据库的事务管理配置jta

    在提供的XML配置示例中,我们可以看到Spring框架是如何配置两个不同的数据源,并为它们设置JTA事务管理器的。 ##### 数据源配置 首先,我们来看数据源的配置部分: ```xml <value>200 <value>70...

    Jta的jar包

    **标题与描述解析** ...总结,JTA和JBarcode分别代表了Java环境中处理分布式事务和生成条形码的两个重要工具。在开发企业级Java应用,特别是涉及数据库操作和跨系统数据交换时,理解和使用这些技术是非常关键的。

    最新的 jta包 用于quartz缺少jar

    如果是在非Spring环境中,可能需要手动配置JTA事务管理器。 总结来说,解决"最新的jta包用于quartz缺少jar"的问题,你需要做以下几步: 1. 将`jta-1.3.1(1)`解压并添加到项目类路径。 2. 检查并更新Quartz的配置...

    JTA1.2规范

    #### 三、JTA 1.2 规范的核心概念 JTA 1.2 规范主要涵盖了以下几个核心概念: 1. **事务**:事务是一组操作的集合,这些操作要么全部成功完成,要么全部失败并回滚。事务的基本属性包括原子性(Atomicity)、一致性...

    Java事务处理总结

    根据应用场景的不同,可以选择使用JDBC事务、JTA事务或容器事务等不同的事务处理方式。每种方式都有其特定的应用场景和优势,开发者应根据具体需求选择最合适的事务处理机制。通过合理利用这些事务管理技术,可以...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    总结来说,集成Spring、JTA、JOTM或Atomikos进行分布式事务处理,是提高系统扩展性和可靠性的重要手段。通过上述步骤,开发者能够在Tomcat应用服务器上实现跨数据库的事务一致性,从而构建更健壮的分布式应用。

    Java事务总结.docx

    ### Java事务总结 #### 事务的基本概念与属性 在计算机科学中,特别是在数据库管理系统中,**事务**是一种机制,用于确保一系列操作作为一个整体被执行。事务包含三个基本的行为:开始事务、提交事务以及回滚事务...

    java事务处理总结

    JTA事务管理 JTA(Java Transaction API)是Java平台标准的事务API,它提供了一个更为高级的事务管理模型,适用于分布式事务场景。JTA支持多数据源、消息队列等多种资源的事务协调。JTA的核心接口包括: - `...

    geronimo-jta_1.1_spec-1.1-sources.jar.zip

    Hibernate作为流行的Java持久层框架,提供了对JTA事务的支持。在Java EE环境中,结合Geronimo JTA,可以实现全局的事务管理。以下是如何在Hibernate中配置和使用Geronimo JTA 1.1的步骤: 1. 配置Hibernate:在...

    JAVA事务配置总结

    本文将对三种不同的事务配置方式进行深入探讨:本地事务、全局事务以及结合动态数据源的事务管理。这些配置方式在处理多数据源和复杂业务场景时具有不同的优势和适用性。 首先,我们来看“本地事务”。本地事务通常...

    Java分布式开发spring+jta+jotm

    Java分布式开发是一个复杂而关键的领域,特别是在大型企业级...`DefaultJtaPlatform`指定了JOTM作为事务管理器,而`JtaTransactionManager`是Spring中处理JTA事务的核心类。在XML配置中,这可能看起来像这样: ```xml ...

    详解Hibernate事务处理机制

    - **JTA事务管理**:更高级的一种事务管理模式,用于分布式环境中多个资源管理器之间的事务协调。这种方式通常与EJB容器一起使用。通过配置`hibernate.transaction.factory_class`为`...

    集成jta-atomikos 实现分布式事务.zip

    总结来说,集成`jta-atomikos`实现在SpringBoot中的分布式事务管理是一项复杂但至关重要的任务。通过添加Atomikos的依赖、配置事务管理器以及在服务层使用`@Transactional`注解,我们可以确保在分布式环境下的操作...

    Hibernate事务和并发控制

    在Hibernate中配置JTA事务,需要在`hibernate.cfg.xml`中设置`transaction.factory_class`为`org.hibernate.transaction.JTATransactionFactory`,并确保应用服务器提供JTA支持。使用JTA事务的代码通常涉及与应用...

    事务处理与异常处理全面的讲解

    在JTA事务中,`XAResource`接口定义了事务管理器如何与数据源交互。`XADataSource`和`XAConnection`用于创建支持JTA事务的连接。这些接口允许事务跨越多个资源(如多个数据库)进行。 **异常处理**: 在Java中,...

Global site tag (gtag.js) - Google Analytics