spring 中不同事务管理器的嵌套事务
Nested transactions with different transaction managers in spring
我正在尝试使用不同的事务管理器嵌套事务,其中如果嵌套事务失败,外部主事务也需要回滚
@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()
中的事务不会回滚。如何使回滚生效?
大胆声明
你做错了。
根据您的描述,
你想要 ChainedTransactionManager.
为您的每个数据源创建一个事务管理器,
然后将事务管理器传递给 ChainedTransactionManager
构造函数。
命名 ChainedTransactionManager
bean 并在 a 中引用该名称
@Transactional
注释。
我认为 属性 被命名为 "transactionManager"。
例如,
@Transactional(transactionManager = "chainedTransactionManagerBeanName")
当您在同一 bean 中引用该方法时,@Transaction 将被忽略。这些注释仅在通过 Spring bean 管理引用时使用,这将生成一个代理:
所以调用 doOps2 不会对 @Transactional txmanager2 做任何事情
我正在尝试使用不同的事务管理器嵌套事务,其中如果嵌套事务失败,外部主事务也需要回滚
@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()
中的事务不会回滚。如何使回滚生效?
大胆声明
你做错了。
根据您的描述, 你想要 ChainedTransactionManager.
为您的每个数据源创建一个事务管理器,
然后将事务管理器传递给 ChainedTransactionManager
构造函数。
命名 ChainedTransactionManager
bean 并在 a 中引用该名称
@Transactional
注释。
我认为 属性 被命名为 "transactionManager"。
例如,
@Transactional(transactionManager = "chainedTransactionManagerBeanName")
当您在同一 bean 中引用该方法时,@Transaction 将被忽略。这些注释仅在通过 Spring bean 管理引用时使用,这将生成一个代理:
所以调用 doOps2 不会对 @Transactional txmanager2 做任何事情