java - 关于 JtaTransactionManager 的问题

标签 java spring hibernate transactions jta

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

  1. 数据源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. Is it ok that the datasource is is made oforg.apache.commons.dbcp.BasicDataSource instead of JNDI?

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

  1. If I have a datasource DS_A and another datasource DS_B, which both requires within the same transaction manager, then which should be the UserTransaction and how to define the TransactionManager, as I am just creating the JtaTransactionManager, does it mean another JtaTransactionManager?

JtaTransactionManager 是 JTA 的实现,委托(delegate)给后端 JTA 提供者。因此,您需要一个实现分布式事务的 JTA 提供程序。 Bitronix就是这样的 JTA 提供商之一。需要进行各种配置

a. hibernate 属性

<prop key="hibernate.transaction.factory_class">
<prop key="hibernate.transaction.manager_lookup_class">
<property name="useTransactionAwareDataSource" value="true"/>

b.定义事务管理器和用户事务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>

c.事务拦截器和注释支持

    <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. If everything is well defined in application context, then which transaction manager bean should referred in @Transactional annotation, if there are two datasources?

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

关于java - 关于 JtaTransactionManager 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408647/

相关文章:

java - 为什么我不能在 java ee 项目中使用 PDDOCUMENT PDFBOX ?

spring - 为什么 Spring 安全性基于用户名而不是用户 ID?

java - transient 域实例jpa&spring

java - 双向变得比单向慢得多

java - JPA/eclipse-link 2.6.0/mysql : incorrect generated table name

java - 在字符串中搜索 "%5B%7E%5D"的正则表达式是什么?

java - 无法在 linkedin Rest API 中获取教育详细信息

java - 找不到类型为 : class org. json.JSONArray 的返回值的转换器

java - 安装 JDK 9 后无法启动 Spring Tool Suite

java - 如何从 hibernate auto ddl 中排除架构