有关JtaTransactionManager的问题

时间:2014-12-10 18:51:40

标签: java spring hibernate transactions jta

我正在寻找一种方法将Spring和JTA的两个数据源的CRUD放入一个事务中,但有以下问题:

  1. datasource是由org.apache.commons.dbcp.BasicDataSource代替JNDI吗?
  2. 有两个参数来引导JtaTransactionManager:

    public JtaTransactionManager(UserTransaction userTransaction,
                         TransactionManager transactionManager)
    

    来自Spring document

    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/> 
    
  3. 如果在应用程序上下文中定义了所有内容,那么在@Transactional注释中应该引用哪个事务管理器bean,如果有两个数据源?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 数据源是由GB.apache.commons.dbcp.BasicDataSource而不是JNDI构成的吗?
  2.   

JNDI只是一种访问数据源的方法。要跨数据库分布事务,您需要使用事务数据源。对于例如microsoft sql server jdbc驱动程序有一个事务数据源 - com.microsoft.sqlserver.jdbc.SQLServerXADataSource

  
      
  1. 如果我有一个数据源DS_A和另一个数据源DS_B,它们都需要在同一个事务管理器中,那么应该是   UserTransaction以及如何定义TransactionManager,就像我一样   创建JtaTransactionManager,它是否意味着另一个   的JtaTransactionManager?
  2.   

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;
   }
}
  
      
  1. 如果在应用程序上下文中定义了所有内容,那么@Transactional注释中应引用哪个事务管理器bean,   如果有两个数据源?
  2.   

我认为上述解释应该回答这个问题。只有一个事务管理器管理两个数据源上的事务。这些称为分布式事务,它们使用两阶段提交协议。浏览this链接,获取有关XA交易的介绍性文章。