我正在寻找一种方法将Spring和JTA的两个数据源的CRUD放入一个事务中,但有以下问题:
datasource
是由org.apache.commons.dbcp.BasicDataSource
代替JNDI吗?有两个参数来引导JtaTransactionManager:
public JtaTransactionManager(UserTransaction userTransaction,
TransactionManager transactionManager)
userTransaction - the JTA UserTransaction to use as direct reference
transactionManager - the JTA TransactionManager to use as direct reference
如果我有一个数据源DS_A
和另一个数据源DS_B
,这两个数据源都需要在同一个事务管理器中,那么哪个应该是UserTransaction
以及如何定义TransactionManager
因为我只是创建JtaTransactionManager,它是否意味着另一个JtaTransactionManager?此外,它看起来两个参数都不是必需的,所以JtaTransactionManager可以从以下方式检测它们:
<context:annotation-driven/>
<tx:jta-transaction-manager/>
如果在应用程序上下文中定义了所有内容,那么在@Transactional
注释中应该引用哪个事务管理器bean,如果有两个数据源?
答案 0 :(得分:1)
- 数据源是由GB.apache.commons.dbcp.BasicDataSource而不是JNDI构成的吗?
醇>
JNDI只是一种访问数据源的方法。要跨数据库分布事务,您需要使用事务数据源。对于例如microsoft sql server jdbc驱动程序有一个事务数据源 - com.microsoft.sqlserver.jdbc.SQLServerXADataSource
。
- 如果我有一个数据源DS_A和另一个数据源DS_B,它们都需要在同一个事务管理器中,那么应该是 UserTransaction以及如何定义TransactionManager,就像我一样 创建JtaTransactionManager,它是否意味着另一个 的JtaTransactionManager?
醇>
JtaTransactionManager是JTA的一个实现,委托给后端JTA提供程序。因此,您需要一个实现分布式事务的JTA提供程序。 Bitronix就是这样的JTA提供商。需要各种配置
一个。 hibernate.properties
<prop key="hibernate.transaction.factory_class">
<prop key="hibernate.transaction.manager_lookup_class">
<property name="useTransactionAwareDataSource" value="true"/>
湾定义事务管理器和usertransaction bean
<bean id="BitronixTransactionManager" factory-method="getTransactionManager"
class="bitronix.tm.TransactionManagerServices" depends-on="bitronixConfiguration"
destroy-method="shutdown">
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="BitronixTransactionManager"/>
<property name="userTransaction" ref="BitronixTransactionManager"/>
<property name="allowCustomIsolationLevels" value="true"/>
</bean>
℃。事务拦截器和注释支持
<bean id="annotationTransactionSource"
class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref local="annotationTransactionSource"/>
</property>
</bean>
Spring 3.1还引入了@EnableTransactionManagement
注释,因此另一种配置方式是
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
...
}
@Bean
public PlatformTransactionManager transactionManager(){
//configure JTA transaction manager
return transactionManager;
}
}
- 如果在应用程序上下文中定义了所有内容,那么@Transactional注释中应引用哪个事务管理器bean, 如果有两个数据源?
醇>
我认为上述解释应该回答这个问题。只有一个事务管理器管理两个数据源上的事务。这些称为分布式事务,它们使用两阶段提交协议。浏览this链接,获取有关XA交易的介绍性文章。