当前位置:网站首页>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个事务中,一个事务对数据修改,另一个事务内不可见。如果有依赖另一个事务的数据要处理下。
- 再次测试,外层代码操作保存了。结果如下所示。

案例代码
边栏推荐
- dsafasfdasfasf
- 2022-08-08 第四小组 修身课 学习笔记(every day)
- 力扣349-两个数组的交集——HashSet
- 2022/08/08 学习笔记 (day25)File类
- 学习一下 常说的节流
- 【基于富瀚6630使用/dev/fb0显示设备和TDE模块渲染bmp图像】
- STM32之vl53l0x读取距离
- 【HMS core】【Ads Kit】华为广告——海外应用在国内测试正式广告无法展示
- 快速上手Shell,看这一篇就够了
- Still don't know what business intelligence (BI) is?After reading this article, you will understand
猜你喜欢

Quantitative Genetics Heritability Calculation 1: Parent-Child Regression Method

力扣202-快乐数——哈希集合

aur安装报错一个或多个文件没有通过有效性检查!

图解LeetCode——761. 特殊的二进制序列(难度:困难)

软件测试的发展趋势

Storage System Architecture Evolution

浅谈单片机Boot的几种自刷新方式

STM32定时器输入捕获频率(cube)

22-08-08 西安 尚医通(04)MongoDB命令、MongoTemplate、MongoRepository

3.3V控制输出5V的方法
随机推荐
[UNR #6 A] Noodle-based road (shortest path)
Hhhhgffsb
详谈归并排序时间复杂度过程推导----软考
亚马逊面对风控,自养号测评时应该怎么做?
滑动窗口篇
dsafasfdasfasf
中断系统结构及中断控制详解
matlab simulink球杆控制系统的模糊PID控制设计
STM32的Cube学习笔记(ADC)
Storage System Architecture Evolution
【Harmony OS】【ARK UI】Custom popup
Zuul---路由功能
PWM输出模块PCA9685
如何选型APS系统,还需明确这七大关键因素
php uses phpoffice/phpspreadsheet to import and export excel tables
【开发者必看】【push kit】推送服务服务典型问题合集2
TP6的安装与测试
JDBC_PreparedStatement预编译对象
MySQL---performance schema
C进阶 - 程序的编译(预处理操作) + 链接