当前位置:网站首页>Transaction rolled back because it has been marked as rollback-only
Transaction rolled back because it has been marked as rollback-only
2022-08-09 05:12:00 【愤怒的苹果ext】
背景
- 业务要求即使内层代码有报错,也要执行外层代码,保存数据,代码案例如下所示。
// TestServiceImpl:
@Override
@Transactional(rollbackFor = Exception.class)
public void testInsert() {
Users entity = new Users();
entity.setName("张三啊");
usersMapper.insert(entity);
System.out.println(entity.getId());
try {
testExceptionService.test();
} catch (Exception e) {
e.printStackTrace();
}
}
//TestExceptionServiceImpl
@Override
@Transactional(rollbackFor = Exception.class)
public void test() {
Users entity = new Users();
entity.setName("李四啊");
usersMapper.insert(entity);
System.out.println(entity.getId());
if (true){
throw new RuntimeException("测试事务回滚");
}
}
- 按照我们主观认知,
try catch
捕获异常后,事务不会回滚。 - 我们来执行一下。
- 此时
testExceptionService.test()
报错,就会抛出Transaction rolled back because it has been marked as rollback-only
,外层的代码也会回滚。如下图所示。
- 同样的数据全回滚了,张三啊,李四啊都不会保存,如下图所示。
问题分析
- 首先
@Transactional
的属性propagation
是默认的Propagation.REQUIRED
。 - 此时外层有事务,那么
testExceptionService.test()
是不会新开事务的。 - 也就是说用的是
同一个事务
,肯定有一些事务状态(变量)是共用的,那么testExceptionService.test()
报错,要回滚,那么就都要回滚。捕获
是无效的。
解决方案
- 问题的关键点就是
同一个事务
。开启另一个事务就可以了,像本例的背景就可以这样操作。使用Propagation.REQUIRES_NEW
。如下代码所示。
@Override
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public void test() {
Users entity = new Users();
entity.setName("李四啊");
usersMapper.insert(entity);
System.out.println(entity.getId());
if (true){
throw new RuntimeException("测试事务回滚");
}
}
- 也可以在controller层调用2个方法,分层2个事务执行。
- 注意:2个事务中,一个事务对数据修改,另一个事务内不可见。如果有依赖另一个事务的数据要处理下。
- 再次测试,外层代码操作保存了。结果如下所示。
案例代码
边栏推荐
猜你喜欢
随机推荐
C语言之内存函数
【日常训练--腾讯精选50】7. 整数反转
【LeetCode】136. 只出现一次的数字
机器人大赛总结
Quantitative Genetics Heritability Calculation 1: Parent-Child Regression Method
Pycharm Debug调试使用+代码调试理解
时序约束基础
数据库设计---三范式和反范式设计
二分搜索篇
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
Harmony OS ets ArkUI 】 【 】 development create a view and building layout
NFT协议OMNI因重入攻击损失1300ETH
Address book (dynamic version) (C language) (VS)
【Harmony OS】【ArkUI】ets开发 创建视图与构建布局
Parameters in dynamic libraries cannot be modified through macro definitions or global variables in header files
Hhhhgffsb
C Advanced-C Language File Operation
学习一下 常说的节流
【Harmony OS】【ARK UI】Custom popup
【计算机网络-哈工大】---学习笔记(下)---(一)网络安全、密码学基础、对称、公钥、身份认证、数字签名、KDC\CA