spring事务传播行为的思考
2024-08-25 21:21:29
1.问题
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)
public class ActivityPublishComposeTest extends BaseUnitTest { @Autowired
private ActivityPublishCompose activityPublishCompose; @Test
@Rollback
public void testPublishActivityScheme() {
long start = System.currentTimeMillis();
Map<String, Object> map = activityPublishCompose.publishActivityScheme(25661L, "H1916", "unit test publish");
System.out.println("cost:" + (System.currentTimeMillis()-start));
assertNotNull(map);
assertTrue(map.size() != 0);
}
}
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> publishActivityScheme(Long activitySchemeId, String operator, String comment) {
ActivitySchemeDTO schemeDTO = activityPublishService.selectAllActivitySchemeEditData4Publish(activitySchemeId, false);
...
}
内层方法上的事务提交会影响外层方法上的事务Rollback吗?
2.思考与解决
从运行结果看,Rollback生效,是外层事务Rollback同时会影响内层事务的提交吗?查询关于spring事务的资料,发现这个问题不是内外层事务提交回滚的问题,而是spring事务传播行为的问题。在这里我们使用的是spring的默认传播行为,即Propagation.REQUIRED
@Transactional注解中定义了默认的传播行为,这个Propagation.REQUIRED会检查当前是否已经有事务了,没有才创建一个新事务,如果已经有事务了,就支持当前事务,所以说内外层是同一个事务,那么只有外层方法上的事务提交时,事务才会真正提交。
修改内层方法上事务的传播行为成Propagation.REQUIRES_NEW,运行测试用例,发现事务被提交,外层方法上的Rollback不起作用。由此可知Propagation.REQUIRES_NEW是新生成一个事务,外层事务提交不能影响它。
3.参考资料
http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt216
最新文章
- NFC:Arduino、Android与PhoneGap近场通信
- insert table 和create table as 区别
- MySql指令集
- Add Customerlize Button in More Button List In Odoo
- A Simple Problem with Integers(树状数组HDU4267)
- HTML5 input新增的几种类型(数字、日期、颜色选取、范围)
- 怎么从代码中拿到栈回溯信息(call stack trace)
- iOS字体 UIFont 字体名字大全
- 分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读
- WinForm控件Dock属性设置会遮盖其他控件的解决
- how find out what is causing Visual Studio to think each project is out of date
- [每天解决一问题系列 - 0005] WiX Burn 如何校验chained package的合法性
- 那些年我们遇到的坑(1)-Description Resource Path Location Type Archive for required library
- sqlserver服务器名称改成本地IP地址登录
- 第十三次ScrumMeeting博客
- sql server中的日期函数
- FTRL算法
- Mac Finder中如何复制当前完整路径
- Ecplise项目转移到Android Studio,以及Genymotion模拟器介绍
- python3.x学习笔记2018-02-05更新