OMG,到底在寻找什么..................
(构造一个完美的J2EE系统所需要的完整知识体系)
posts - 198,  comments - 37,  trackbacks - 0

转贴地址:http://spring.jactiongroup.net/viewtopic.php?p=5305&sid=db136be488b88cb911bf4903611c2ac7

JTA UserTransaction与JTA TransactionManager

  让我们来看一些Spring的JTA支持的详细情况。虽然理解该机制是很有帮助的,但是通常不必为之担心。对于像前面的小节所展示的简单用例,只需要一个标准的JtaTransactionManager定义,以及由J2EE服务器提供的支持XA规范的DataSource。

  默认的Spring JtaTransactionManager设置将从标准的JNDI位置获取JTA的 javax.transaction.UserTransaction对象,该JNDI位置由J2EE指定:java: comp/UserTransaction。对于大多数标准J2EE环境下的用例来说,它工作良好。

  但是,默认的JtaTransactionManager不能执行事务挂起操作(即它不支持PROPAGATION_REQUIRES_NEW 和PROPAGATION_NOT_SUPPORTED)。原因是标准的JTA UserTransaction接口不支持挂起或恢复事务的操作;它只支持开始和完成新事务的操作。

  为执行事务挂起操作,还需要提供javax.transaction.TransactionManager实例,按照JTA的规定,它提供标准的挂起和恢复方法。遗憾的是,J2EE没有为JTA TransactionManager定义标准的JNDI位置!因此,必须使用特定于供应商的(vendor-specific)查寻机制。
代码:

<bean id="transactionManager"
   class="org.springframework.transaction.jta.JtaTransactionManager">
     <property name="transactionManagerName">
        <value>vendorSpecificJndiLocation</value>
     </property>
</bean>

 


实质上,J2EE没有考虑把JTA TransactionManager接口作为它的公开API的一部分。JTA规范规定的TransactionManager接口原本是打算用于容器集成的。虽然这可以理解,但是为JTA TransactionManager定义标准的JNDI位置还是有重大意义的,尤其是对于轻量级容器(如Spring);然后,便可以以同样的方式来定位任意的J2EE服务器的JTA TransactionManager。

  不仅Spring的JtaTransactionManager将从对JTA TransactionManager的访问中获益,而且O/R映射工具,比如Hibernate、Apache OJB和Kodo JDO也将从中受益,因为他们需要利用该接口在JTA环境中执行缓存同步--即在JTA事务完成时释放缓存锁。注册事务同步的能力只能由JTA TransactionManager接口而不是UserTransaction句柄提供。因此,每个工具都需要实现自己特定于供应商的 TransactionManager查寻适配器。

  为JTA TransactionManager定义标准的JNDI位置是许多基础架构软件供应商在J2EE方面的强烈愿望。如果J2EE 5.0规范的开发团队能意识到该功能的重要性,那就太好了。幸运的是,优秀的J2EE服务器(如WebLogic Server)已经考虑将其JTA TransactionManager作为公开的API,包括特定于供应商的扩展!

结合了WebLogic JTA的Spring事务划分

  对于WebLogic Server,JTA TransactionManager的正式JNDI位置是javax.transaction.TransactionManager。在Spring 的JtaTransactionManager中,该值可被指定为“transactionManagerName”。一般来说,这启用了使用 WebLogic JTA子系统的Spring驱动的事务挂起,激活了对PROPAGATION_REQUIRES_NEW和 PROPAGATION_NOT_SUPPORTED的支持。 代码:

<bean id="transactionManager"
   class="org.springframework.transaction.jta.JtaTransactionManager">
 <property name="transactionManagerName">
   <value>javax.transaction.TransactionManager</value>
 </property>
</bean>

 

除了标准的JtaTransactionManager和它所支持的通用配置选项,Spring还支持一种特殊的WebLogicJtaTransactionManager适配器,它直接利用WebLogic的JTA扩展。

<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>

  除了自动检测WebLogic的JTA TransactionManager,它还支持不属于标准JTA的三个重要特性:

事务名称(Transaction name)--将Spring的事务名称暴露给WebLogic Server,使Spring事务在WebLogic的事务监视器上可见。默认的情况下,Spring将对声明性事务使用全限定方法名。
按事务的隔离级别(Per-transaction isolation level)--将Spring事务属性中指定的隔离级别应用到WebLogic JTA事务。这支持按事务指定数据库的隔离级别,而标准的JTA并不支持。
强制性事务恢复(Enforcing transaction resume)--恢复WebLogic事务,即使挂起的事务已标记为rollback-only(只能回滚)。这要求调用forceResume()方法,使用WebLogic底层的扩展的TransactionManager接口。

  
下面的图像显示的是WebLogic Server的事务监视器,它按名称列出了一组Spring驱动的事务:

 

图2. WebLogic Server的事务监视器(点击图片查看大图)

Spring的WebLogicJtaTransactionManager实际上暴露了WebLogic Server的事务管理器针对基于Spring的应用程序的全部功能。它使Spring事务划分成为EJB CMT的一个极具吸引人的替代方案,而且它提供同级别的事务支持。

  注意,只有实际需要挂起事务或使用WebLogic的JTA扩展时,才需要对特定于WebLogic的JTA进行设置。对于标准的事务划分(如PROPAGATION_REQUIRED或PROPAGATION_SUPPORTS),标准的JTA设置就足够了。


Spring和EJB CMT

  如上所述,针对POJO的Spring声明性事务划分可以看作传统的EJB CMT的替代方案。但是,Spring和EJB并不是互相排斥的。Spring应用程序上下文也可以作为EJB外观的后端,管理数据访问对象(DAO)和其它的细粒度业务对象。

  在EJB场景中,事务由EJB CMT驱动。Spring的数据访问支持会自动地检测这样的环境并进行相应的调整。例如,Spring的Hibernate支持将为其隐式资源管理提供 EJB驱动的事务,就像它提供Spring驱动的事务一样。它甚至提供相同的语义,而不需要对DAO代码做任何修改。

  Spring有效地将DAO实现从实际的运行时环境中分离出来。DAO可以参与到Spring事务(以哪个事务策略作为后端都可以)和EJB CMT事务中。这不仅支持其它环境中的重用,还支持在J2EE容器之外的测试中直接使用。

结束语

  Spring Framework为J2EE和非J2EE环境提供了完善的事务划分功能,具体来说就是为纯Java目标对象提供声明性事务。这允许在没有EJB的情况下,以一种灵活和非入侵的方式便捷地进行事务划分。与EJB相比,这些事务POJO应用程序对象可以在J2EE容器之外轻松地测试或重用。

  Spring提供了多种开箱即用的事务策略,比如JtaTransactionManager和JDBC DataSourceTransactionManager,前者委托给J2EE服务器的事务协调程序,后者则针对单个JDBC DataSource(即单个的目标数据库)执行事务。通过对后端配置进行简单的更改,Spring就能够轻松地调整事务策略适应另一个环境。

  除了标准的JTA支持,Spring还提供与WebLogic Server的JTA扩展的完善集成,支持一些高级特性(如事务监控和按事务的隔离级别)。通过这种专门的WebLogic Server支持,WebLogic的事务管理器的全部功能都可应用于基于Spring的应用程序。

  Spring事务划分是对EJB CMT的极具吸引人的替代方案,特别是与基于POJO的轻量级架构结合后。在一个声明性事务是选择Local Stateless Session Bean(局部无状态会话Bean)的惟一原因的场景中,基于Spring的POJO服务模型是一个可行的选择,它提供更高水平的灵活性、可测试性和重用。


参考资料

Spring Framework--Spring的官方web站点。
Spring 参考手册
JTA规范。 http://java.sun.com/products/jta/
WebLogic JTA--WebLogic的JTA扩展的说明文档
http://e-docs.bea.com/wls/docs81/jta/jtaapi.html#1053904

posted on 2006-10-24 09:04 OMG 阅读(2195) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔分类

随笔档案

IT风云人物

文档

朋友

相册

经典网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜