最近和莉莉一起准备,一起研究各种技术和方法,可是一种学无止境的感觉不时地冒出来,让人觉得,个人的水平提高简直是一件遥遥无期的事情,学的越多,不懂的越多,确实心烦不已。技术、框架、API,各种名词越看越多,越看越头大,没有在实际工作中用到的技术,都有点纸上谈兵的感觉。但是话又说回来,也只能去多接触,多看多想多实践,才能增加知识面,触类旁通。也许当时看的很迷茫,总觉得是学到了皮毛,根本没有领会其内涵,但是在时间不够充足的情况下,也只能这样,这就好比博览群书,不求甚解,至少为自己当前的开发工作提供更多的思路,也在之后遇到需要用这种技术的地方的时候,不至于手足无措。
回到正题,JTA,关于它的简介百度谷歌写了一堆,大体意思是:Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)。一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。
这概念看着就头晕,明确一点就是,首先JTA是一个分布式的事务服务。关于事务,之前的数据库概论之类的书籍里面已经讲了很多了,事务是恢复和并发控制的基本单位,事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。在实际开发中,操作事务的方法无非就是通过begin 来起动事务,通过commit提交已完成的事务,通过rollback来对出现异常的事务进行回滚操作。各种事务系统都大同小异,JTA也是不例外的。但是,与众不同的是,JTA提供了分布式的事务服务,就是分布式这几个字,将它和其他事务系统区别开来。
如何理解JTA的分布式呢?我认为,在目前的J2EE系统中,为了达到数据库系统灾备、跨数据库共享数据等目的,一个系统可能会有多个数据库连接。对某个含有数据库操作的事务,也就有可能包括了对多个数据库同时进行更新的需求。这些需求在一般的事务系统中,仅仅对操作单个数据库进行了事务处理,保证其有效可靠。但是如果某次数据增删改操作,对一个数据库起效果了,而对其他的数据库没有起效,那么就会导致各个数据库直接的数据不同步问题。如果使用了JTA这样的分布式事务操作,那么结果就是,要么对所有有关系的数据库全部更新,要么就全部不更新。保证整个系统的数据一致。
JTA与JDBC或者其他需要运用到事务的组件的关系(摘自百度百科):
JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。这与我上面所述的意思类似,这样举一反三的思考,下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans(EJB)、一个用J2EE Connector Architecture 规范编译的资源分配器等等。这些组件都有自己的事务处理机制,但若是需要分布式事务服务的时候,就需要引入JTA的支持。
JTA管理事务需要注意的(摘自51cto http://book.51cto.com/art/200806/76686.htm)
(这个是在EJB JPA数据库持久层开发中提到的,但是我认为也能够进行推广)
JTA事务(Java Transaction API)是J2EE规范中有关事务的标准。它是容器级别的事务,只能运行在J2EE服务器中。它的最大优势是可以支持分布式的事务,如果系统采用的是分布式的数据库,那么只能选择JTA管理EntityManager事务。使用JTA管理EntityManager事务时,需要注意以下几个问题。
1、JTA事务只能运行在J2EE的环境中,即EJB容器中和Web容器中;而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。
2、容器托管的EntityManager对象只能采用JTA的事务,而不能采用RESOURCE_LOCAL事务。
JTA的事务和RESOURCE_LOCAL事务的区别(摘自 http://book.51cto.com/art/200806/76687.htm)
(这个是在EJB JPA数据库持久层开发中提到的)
RESOURCE_LOCAL事务数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用RESOURCE_LOCAL管理EntityManager事务。
学习参考资料:
1、JTA 深度历险 - 原理与实现 http://www.ibm.com/developerworks/cn/java/j-lo-jta/
--IBM的人写的,感觉通俗易懂,通过简单的代码讲解了JTA的实现原理
2、关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
http://blog.csdn.net/bluishglc/article/details/7612811
---讲解分布式事务的纯理论了。XA是由X/Open组织提出的分布式事务的规范。JTA是基于XA架构上建模的。使用了两阶段提交的原理。
3、mysql使用JTA实例 http://make19830723.iteye.com/blog/839017
--通过main方法去验证JTA的例子,我没有去验证这个代码是否准确,但看起来是脱离了J2EE容器去使用JTA的具体例子,这个很奇怪,有环境的时候再去验证一下。