首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

JTA事宜原理深度历险

2012-09-25 
JTA事务原理深度历险转载:http://www.ibm.com/developerworks/cn/java/j-lo-jta/?开发人员使用开发人员接

JTA事务原理深度历险

转载:http://www.ibm.com/developerworks/cn/java/j-lo-jta/

?

开发人员使用开发人员接口,实现应用程序对全局事务的支持;各提供商(数据库,JMS 等)依据提供商接口的规范提供事务资源管理功能;事务管理器( TransactionManager )将应用对分布式事务的使用映射到实际的事务资源并在事务资源间进行协调与控制。 下面,本文将对包括 UserTransaction、Transaction 和 TransactionManager 在内的三个主要接口以及其定义的方法进行介绍。

面向开发人员的接口为 UserTransaction (使用方法如上例所示),开发人员通常只使用此接口实现 JTA 事务管理,其定义了如下的方法:

  • begin()- 开始一个分布式事务,(在后台 TransactionManager 会创建一个 Transaction 事务对象并把此对象通过 ThreadLocale 关联到当前线程上 )
  • commit()- 提交事务(在后台 TransactionManager 会从当前线程下取出事务对象并把此对象所代表的事务提交)
  • rollback()- 回滚事务(在后台 TransactionManager 会从当前线程下取出事务对象并把此对象所代表的事务回滚)
  • getStatus()- 返回关联到当前线程的分布式事务的状态 (Status 对象里边定义了所有的事务状态,感兴趣的读者可以参考 API 文档 )
  • setRollbackOnly()- 标识关联到当前线程的分布式事务将被回滚

    面向提供商的实现接口主要涉及到 TransactionManager 和 Transaction 两个对象

    Transaction 代表了一个物理意义上的事务,在开发人员调用 UserTransaction.begin() 方法时 TransactionManager 会创建一个 Transaction 事务对象(标志着事务的开始)并把此对象通过 ThreadLocale 关联到当前线程。UserTransaction 接口中的 commit()、rollback(),getStatus() 等方法都将最终委托给 Transaction 类的对应方法执行。Transaction 接口定义了如下的方法:

    • commit()- 协调不同的事务资源共同完成事务的提交
    • rollback()- 协调不同的事务资源共同完成事务的回滚
    • setRollbackOnly()- 标识关联到当前线程的分布式事务将被回滚
    • getStatus()- 返回关联到当前线程的分布式事务的状态
    • enListResource(XAResource xaRes, int flag)- 将事务资源加入到当前的事务中(在上述示例中,在对数据库 A 操作时 其所代表的事务资源将被关联到当前事务中,同样,在对数据库 B 操作时其所代表的事务资源也将被关联到当前事务中)
    • delistResourc(XAResource xaRes, int flag)- 将事务资源从当前事务中删除
    • registerSynchronization(Synchronization sync)- 回调接口,Hibernate 等 ORM 工具都有自己的事务控制机制来保证事务, 但同时它们还需要一种回调机制以便在事务完成时得到通知从而触发一些处理工作,如清除缓存等。这就涉及到了 Transaction 的回调接口 registerSynchronization。工具可以通过此接口将回调程序注入到事务中,当事务成功提交后,回调程序将被激活。

      TransactionManager 本身并不承担实际的事务处理功能,它更多的是充当用户接口和实现接口之间的桥梁。下面列出了 TransactionManager 中定义的方法,可以看到此接口中的大部分事务方法与 UserTransaction 和 Transaction 相同。 在开发人员调用 UserTransaction.begin() 方法时 TransactionManager 会创建一个 Transaction 事务对象(标志着事务的开始)并把此对象通过 ThreadLocale 关联到当前线程上;同样 UserTransaction.commit() 会调用 TransactionManager.commit(), 方法将从当前线程下取出事务对象 Transaction 并把此对象所代表的事务提交, 即调用 Transaction.commit()

      • begin()- 开始事务
      • commit()- 提交事务
      • rollback()- 回滚事务
      • getStatus()- 返回当前事务状态
      • setRollbackOnly()
      • getTransaction()- 返回关联到当前线程的事务
      • setTransactionTimeout(int seconds)- 设置事务超时时间
      • resume(Transaction tobj)- 继续当前线程关联的事务
      • suspend()- 挂起当前线程关联的事务

        在系统开发过程中会遇到需要将事务资源暂时排除的操作,此时就需要调用 suspend() 方法将当前的事务挂起:在此方法后面所做的任何操作将不会被包括在事务中,在非事务性操作完成后调用 resume()以继续事务(注: 要进行此操作需要获得 TransactionManager 对象, 其获得方式在不同的 J2EE 应用服务器上是不一样的)
        下面将通过具体的代码向读者介绍 JTA 实现原理。下图列出了示例实现中涉及到的 Java 类,其中 UserTransactionImpl 实现了 UserTransaction 接口,TransactionManagerImpl 实现了 TransactionManager 接口,TransactionImpl 实现了 Transaction 接口


        图 2. JTA 实现类图
        JTA事宜原理深度历险?


        清单 3. 开始事务 - UserTransactionImpl implenments UserTransaction

        ?

        应用程序从支持分布式事务的数据源获得的数据库连接是 XAConnection 接口的实现,而由此数据库连接创建的会话(Statement)也为了支持分布式事务而增加了功能,如下代码所示:?
        清单 8. JTA 事务资源处理

        参考资料

        学习

        • Java 官方网站“Java Transaction API Specification”提供了详细的 JTA 信息、包括版本, 规范等,感兴趣的读者可以参考

        • 这篇文章“Java Transaction API 概述”( 编程中国 ) 详细描述了 XA 资源的使用原理, 感兴趣的读者可以参照学习

        • “JOTM”是一款开源的 JTA 实现, 读者可以参照其源代码深入学习

        • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。?

热点排行