Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。
事务管理器(org.framework.*) | 使用场景 |
---|---|
jdbc.datasource.DataSourceTransactionManager | 用于Spring对JDBC抽象的支持。也可用于使用iBATIS进行持久化的场景 |
orm.hibernate3.HibernateTransactionManager | 用于Hibernate3进行持久化 |
orm.jpa.JpaTransactionManager | 用于Java持久化API进行持久化 |
为了使用事务管理器,你需要将其声明在应用程序上下文中。
1.JDBC事务
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.Hibernate事务
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
3.Java持久化API事务
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
JpaTransactionManager还支持将事务应用于简单的JDBC操作之中,这些JDBC操作所使用的DataSource与EntityManagerFactory所使用的DataSource必须是相同的。为了做到这一点,JpaTransactionManager必须装配一个JpaDialect的实现。
需要重点指出的是,JpaDialect实现必须同时支持JPA/JDBC访问。所有Spring所支持的特定厂商JpaDialect实现(EclipseLinkJpaDialect、HibernateJpaDialect、OpenJpaDialect、TopLinkJpaDialect)都提供了对JPA和JDBC混合的支持,而DefaultJpaDialect并不支持。
4.JTA事务
如果前面提到的事务管理器都不能满足你的需求或者你的事务需要跨多个事务资源(例如,两个或更多的数据库),你需要使用JtaTransactionManager。
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
</bean>
transactionManagerName属性指明了要在JNDI上查找JTA事务管理器。