在春季与不同的交易经理进行嵌套交易

时间:2018-06-19 23:16:01

标签: java spring spring-data spring-transactions

我正在尝试与其他事务管理器嵌套事务,如果嵌套事务失败,则外部主事务也需要回滚

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

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

我的spring配置文件有

<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()中的事务不会回滚。如何使回滚工作?

2 个答案:

答案 0 :(得分:3)

粗体字
你做错了。

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

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

答案 1 :(得分:1)

当您在同一个bean中引用该方法时,@ Transaction将被忽略。这些注释仅在通过Spring bean管理进行引用时使用,这将成为代理:

https://www.javacodegeeks.com/2016/05/understanding-transactional-annotation-spring.html#:~:text=At%20a%20high%20level%2C%20when,has%20no%20knowledge%20of%20it

因此,调用doOps2不会对@Transactional txmanager2起到任何作用