java - 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()
不会回滚。如何使回滚工作?
解决方案
大胆的声明
你做错了。
根据您的描述,您需要一个ChainedTransactionManager。
为每个数据源创建一个事务管理器,然后将事务管理器传递给ChainedTransactionManager
构造函数。为ChainedTransactionManager
bean 命名并在
@Transactional
注解中引用该名称。我认为该属性名为“transactionManager”。例如,
@Transactional(transactionManager = "chainedTransactionManagerBeanName")
推荐阅读
- agent - 并行 ContractnetResponder 和 Contractnetresponder
- python - 如何按索引添加两个字符串
- node.js - 为什么 webpack 不完全编译文件?
- android - MPAndroidChart - 折线图不显示线条
- android - NativeScript TabView 图标定位
- php - PDO 中的“无效参数号”
- javascript - 单选按钮复选框
- python - 使用 WTForms RadioField 子字段在 Flask 中显示图像
- unicode - 如何确定一个字符(Unicode 代码点)是从左到右还是从右到左?
- ruby - 在部署新版本的 Sinatra 应用程序时停止特定作业