作者:狂放不羁
网址: http://yuquan.blog.51cto.com

>>> 转载请注明出处!<<<
事务在企业应用系统开发中占据着非常重要的作用,它可以确保一组对资源操作的原子性,并且事务具有ACID属性。先说说两种最常见的事务模型,它们是平面(Flat)事务和嵌入式(Nested)事务。平面事务是由一系列的原子性的操作构成,这些操作一起组成了单个工作单元。而嵌入式事务容许将原子性的工作单元嵌入到其它的工作单元中,并且对于嵌入式事务来说,嵌入的子事务即使回滚了,也不会引起外层事务的回滚。但是当前的EJB规范没有对嵌入式事务做出具体的要求,因此EJB的事务管理器只支持平面事务。下面就具体总结一下J2EE中的两种平面事务:
 
1 JDBC事务。JDBC事务相对来说,比较容易理解。既然是JDBC,那么它的底层事务是通过数据库的事务来实现的。
 
2 分布式JTA事务。JTA事务对分布式的应用系统提供了事务功能。它的底层通过JTS提供的接口来实现。对于我们应用开发者来说,只需要熟悉JTA接口就OK了。JTA provider可以作为一个独立的组件存在,也可以嵌入到具体的J2EE 应用服务器。对于JTA事务,需要理解一下几个概念:
 
  1)事务管理器。事务管理器负责协调具体的资源管理器来完成事务控制。
  2)资源管理器。资源管理器具体来说就是各种驱动程序,对于数据库来说,就是具体的JDBC驱动程序。
  3)事务性的资源。数据库,JMS队列,遗留系统等。
  4)两阶段提交协议(2PC)。2PC对于JTA事务来说相当的重要。2PC的实现非常复杂,简单点来说就是:第一个阶段准备事务的提交,第二个阶段:如果第一个阶段所有的资源管理器都容许提交,那么就提交事务,如果有一个资源管理不同意提交的化,则回滚事务。
 
理解了以上的几个概念后,还需要了解一下几个接口,这几个接口在JTA中也是非常重要的。总结如下:
 1)javax.transaction.xa.XAResource.JTA provider通过此接口与支持X/OPEN 标准的资源管理器通信。(比如支持XA接口的JDBC驱动程序)
 2)javax.transaction.TransactionManager.JTA provider通过此接口实现与J2EE application server的通信。
 3)javax.transaction.UserTransaction。此接口对于我们应用开发者来说最重要。它提供了begin(),commit(),rollback()等操作事务的方法。
 
以上是事务的一些基础的概念,等理解了它们以后,就可以开始事务在J2EE具体应用之旅了。