首页 > 解决方案 > spring 中使用不同事务管理器的嵌套事务

问题描述

我正在尝试使用不同的事务管理器嵌套事务,其中如果嵌套事务失败,则外部主事务也需要回滚

    @Transactional(transactionManager = "txManager1", propagation = Propagation.REQUIRED)
    public int doOps() {
         doSuccessfulDatabaseThings();
         doOps2();
    }

    @Transactional(transactionManager = "txManager2", propagation = Propagation.REQUIRED)
    public int doOps2() {
        //this throws error
    }

我的弹簧配置文件有

<bean id="dataSource1" class ="com.mchange.v2.c3p0.ComboPooledDataSource">
...
</bean>

<bean id="txManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource1" />
</bean>
<!-- txManager2 defined similarly -->
<tx:annotation-driven/>

但是,当doOps2()失败时,事务doOps()不会回滚。如何使回滚工作?

标签: javaspringspring-dataspring-transactions

解决方案


大胆的声明
你做错了。

根据您的描述,您需要一个ChainedTransactionManager

为每个数据源创建一个事务管理器,然后将事务管理器传递给ChainedTransactionManager 构造函数。为ChainedTransactionManagerbean 命名并在 @Transactional注解中引用该名称。我认为该属性名为“transactionManager”。例如,
@Transactional(transactionManager = "chainedTransactionManagerBeanName")


推荐阅读