关于SpringBoot中事务回滚没有生效
在SpringBoot中,事务回滚可以用注解@Transactional标识。
Spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
1、非检查型异常一般继承自Error或者RuntimeException
2、检查型异常一般指继承自Exception的异常
在实际使用过程中,可以自由指定那种异常需要进行事务回滚,一般为以下几种:
1、 让checked例外也回滚: @Transactional(rollbackFor=Exception.class)
2、 让unchecked例外不回滚: @Transactional(noRollbackFor=RunTimeException.class)
3 、不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED),或者不添加
注意: 如果你的异常被手动try{}catch{}了,事务则不会回滚,系统会认为你已经手动进行了异常处理,如果想让事务回滚必须往外抛throw Exception。
在实际使用过程中,有的事务回滚没有生效,这时候需要知道Spring中一个关于事务使用的规则。在同一个类中,一个没有带事务的方法中调用一个带事务的方法时,这个事务回滚不会生效。如下代码所示。
public class M {
public void a(D d) {
try {
System.out.println(d.getA());
b(d);
System.out.println("a--" + d.getA());
}catch (Exception e){
System.out.println("a--" + d.getA());
}
}
@Transactional(rollbackFor = Exception.class)
public void b(D d) {
System.out.println(d.getA());
d.setA(10);
int c = 2;
c = c / 0;
}
}
在上述代码中,a()方法不带事务且调用一个带事务的方法,结果在b()方法执行时,c = c / 0会抛出出书不能为零的异常,正常情况下事务会回滚,也就是实例d中a的值应该回滚到设置为10之前。但是结果表明没有,也就是事务回滚没有生效。
解决办法
1、将无事务方法和有事务方法不要放在同一个类中。
在动态代理机制中,一次操作,proxy不会重复代理一个对象两次,基于代理的method.invoke...方法,无事务方法调用有事务方法时,即使加了事务注解@Transaction也不会生效。
2、获取被代理对象的proxy,让代理对象调用事务方法。
首先在项目启动类上添加动态代理事务注解 @EnableAspectJAutoProxy(exposeProxy = true)
在调用事务方法时,使用AopContext.currentProxy()获取被代理对象的proxy,让后用proxy调用事务方法。代码如下:
(M)AopContext.currentProxy().b(d);
关于SpringBoot中事务回滚没有生效的更多相关文章
- springboot手动事务回滚
亲测在使用@Transactional.@Transactional(rollbackFor = Exception.class)及catch异常之后 throw new RuntimeExcepti ...
- springboot 开启事务回滚
在数据库操作时如果发生异常,回滚的方法 在方法上添加注解@Transactional,作用域是方法级的 参考资料: https://www.cnblogs.com/c2g5201314/p/13163 ...
- SQL 存储过程中事务回滚
在事务语句最前面加上 set xact_abort on GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[test] @a int, @b ...
- Spring中的事务回滚机制
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Trans ...
- springboot 事务回滚
在springboot中,使用事务回滚时,添加@Transactional注解,然后在try-catch块中,发生异常时,在catch中 添加 TransactionAspectSupport.cur ...
- 浅谈Spring中的事务回滚
使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...
- Spring中@Transactional事务回滚
转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部 ...
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销. 要同时修改数据库中两个不同表时,如果它们不是一个事 ...
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销.要同时修改数据库中两个不同表时,如果它们不是一个事务 ...
- [转] C# mysql 事务回滚
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...
随机推荐
- 【阿里天池云-龙珠计划】薄书的机器学习笔记——快来一起挖掘幸福感!Task04
[给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习-阿里云天池 推荐一下我由此上车的公众号:AI蜗牛车,时空序列相关文章挺多的. Task01:基于逻辑回归模型的多 ...
- (JAVA)设计模式-适配器模式
模式的定义和特点: 适配器模式(Adapter)是一种将一个类的接口转换成客户希望的另外一个接口的设计模式,可以提高代码的复用性和灵活性. 结构与实现: 定义一个适配器类来实现业务接口,再继承现有组件 ...
- 如何保留 Excel 表头和第一行数据并追加 CSV 数据
准备工作 在开始之前,确保你的 Python 环境中已经安装了 openpyxl 和 pandas 库.可以使用以下命令进行安装: pip install openpyxl pandas 第一步:编写 ...
- 采用Dapr 的IoT 案例
CNCF 发布了一篇Dapr 的IoT 案例:Tempestive uses Dapr and K8s to track IoT messages | CNCF.Tempestive 是一家物联网解决 ...
- redux中集成immutable.js
安装redux-immutable redux中利用combineReducers来合并reducer并初始化state,redux自带的combineReducers只支持state是原生js形式的 ...
- kettle从入门到精通 第五十课 ETL之kettle 课程源文件分享
Kettle 是一款功能强大的开源 ETL 工具,被广泛应用于数据集成.数据转换和数据加载等领域.随着数据量和多样性的不断增加,使用 Kettle 进行数据处理已成为许多企业和数据工程师的首选.在过去 ...
- kafka集群
对于运维需要掌握的kafka基础操作,读写管理掌握后,下一步就是集群部署搭建了. 1. kafka天然支持集群 2. kafka将集群状态写入zookeeper. 集群部署 1. 确保zk启动 [de ...
- Java实际工作里用到的几种加密方式
1.Base64加密 最简单的加密方式,甚至可以说不是加密,只是一种用64个字符表示任意二进制数据的方法.Base64编码原理是将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补 ...
- 消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计
消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计 1.消息sms 邮箱/手机号/push发送的方案 1.判断收件人地址是否为空, ...
- restTemplate.getForEntity restTemplate.getForObject GET请求
//带参数 @Test public void testGet1(){ String url = "http://IP:PORT/query?token={token}&memNo= ...