|
3.2 使用WAS的JTA Web应用程序在使用事务的时候常常会涉及一个事务类型的选择。是选择像JDBC事务这样的本地事务呢还是使用JTA支持的全局事务。这个与应用程序需要涉及到的事务管理器类型和个数密切相关。Spring本身不支持分布式事务,因此分布式事务需要底层的JTA。但是Spring提供了事务的抽象,即底层真正事务实现可以切换而不影响应用程序代码。这样应用程序可以依赖于底层WAS,也可以轻易地脱离开应用服务器的环境。这一点与前面数据源的抽象非常类似。 WAS本身对于事务划分有两种支持方式,一种是声明式的,当然这种管理方式需要EJB容器的支持,即所谓的容器管理事务(CMT)。另外一种方式是编程式的,通过程序代码来直接使用JTA编程接口。Spring对于事务的划分也可以分为声明式和编程式两种方式。对于Spring编程式的事务划分方式,总体上可以分为两大类。一类是通过直接使用实现PlatformTransactionManager接口的类。另一类是通过使用TransactionTemplate模板类,模板类的使用可以简化事务控制代码。Spring对于声明式事务划分的支持实际上是利用了它的AOP机制。相对于编程式事务划分,这种基于AOP的方式比较灵活,而且对代码的侵入性几乎为零。因此,如果没有特殊需要推荐使用这种事务划分方式。基于AOP的常用事务划分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一种方式相对比较灵活,而后一种则对使用相对比较简单。 无论是哪一种事务划分方式,底层都需要一个事务管理机制作为支撑。如果是单一的事务资源管理器,那么根据所使用的后台事务管理资源不同的类型,可以选择的PlatformTransactionManager实现有DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。无论是单个还是多个事务资源管理器,都可以使用JtaTransactionManager类。如果使用JtaTransactionManager,那么所有事务管理实际都会委托给底层应用服务器的JTA实现。 例如,如果使用JDBC或iBATIS,那么我们可以使用简单的DataSourceTransactionManager,外部配置文件片断如下: <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource"><ref local="dataSource" /></property></bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"><property name="sessionFactory"><ref local="sessionFactory"/></property></bean>
<bean id="wasTxMgr"class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/><bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"><property name="transactionManager"><ref local="wasTxMgr"/></property></bean>
|