java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑
1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物。顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明。另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSourceTransactionManager,我们只需要在对应的方法上或者类上加上@Transaction就会自动接入到spring的事物中,让spring管理。
2.继续踩坑
**01坑:**如下图所示,我这边本地调用接口修改数据库张三口袋里面的金额,并且启用了事物管理,抛出RuntimeExecption。这时我们调用接口,我们可以看到事物生效了,数据库里面值并没有发生改变。但是,当我们把抛出的异常改为
throw new SQLTimeoutException(); 调用接口的时候,发现数据库张三的金额被改变了,事物没起作用,明明开启了事物,但是没起作用,这是为什么呢?
02坑: 在我们需要执行事物的方法,如果对异常进行抛出,并且我们手动捕获了这个异常的话,这时候事物也不会起作用的。如下图所示:
03坑:@Transaction注解只对方法名为pubic的才生效,其他事物不会生效。
04坑: 默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
3.解决方案
01:Spring的事务管理默认是针对Error异常和RuntimeException异常以及其子类进行事务回滚。对runtimeException并不需要抛出,error需要抛出异常,并进行捕获。所以我们上面用到的SQLTimeoutException()并不属于这两者之间,我们需要手动回滚异常,在@Transaction注解里面指定回滚异常类型即可,我这里举一个例子@Transactional(rollbackFor = Exception.class)
02: 我们在需要执行的sercvice里面不应该主动捕获异常,这会导致我们事物不生效,应该继续往上抛,在controller层捕获即可,这样事物也生效了,异常也捕获了。
03:@Transaction注解只对方法名为pubic的才生效,其他事物不会生效。顾名思义,也就是说使用了@Transaction注解的,只能是public。因为只有@Transaction注解只有被其他方法调用才生效的,能被其他方法调用的方法,只能是public。
04:我们在使用事物注解的时候,尽量不要在类上面使用,这会使得类里面的所有方法都会有事物进行处理。比如说,我们一些方法只做查询操作,我们就没有必要再进行事物,我们应该在需要事物处理的方法上面加事物,并且指定回滚的异常类型。
二:既然说到spring的事物了,再说一下spring事物的隔离级别吧
原文 参考文章:https://www.jb51.net/article/204803.htm
Isolation :隔离级别
隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读。
我们可以看 org.springframework.transaction.annotation.Isolation 枚举类中定义了五个表示隔离级别的值:
public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8);
}
DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_COMMITTED 。
READ_UNCOMMITTED :该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
READ_COMMITTED :该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
REPEATABLE_READ :该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。
SERIALIZABLE :所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
指定方法:通过使用 isolation 属性设置,例如:@Transactional(isolation = Isolation.DEFAULT)
Propagation:传播行为
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
我们可以看 org.springframework.transaction.annotation.Propagation 枚举类中定义了6个表示传播行为的枚举值:
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
}
REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。
NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。
指定方法:通过使用 propagation 属性设置,例如:@Transactional(propagation = Propagation.REQUIRED)
到此这篇关于springboot中使用@Transactional注解事物不生效的原因的文章就介绍到这了,更多相关springboot @Transactional不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑相关推荐
- springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- springboot中使用@Transactional注解事物不生效的原因
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- mock 中使用@Transactional注解测试失效问题
mock 中使用@Transactional注解测试失效问题,只需要引入这个就好了 <dependency><groupId>com.h2database</groupI ...
- Spring Boot 中使用 @Transactional 注解配置事务管理
From: https://blog.csdn.net/nextyu/article/details/78669997 事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功 ...
- java四中引用使用场景_Android中四种引用以及适用场景
从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为: 强引用 StrongReference 软引用 SoftReference ...
- java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...
使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...
- java微信获取用户信息_SpringBoot中获取微信用户信息的方法
前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要 ...
- 8个Spring事务失效的场景,你碰到过几种?
前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...
- Transactional注解中事务的传播行为
目录 1.Transactional注解中七种事务传播行为 2.为什么要控制事务的传播行为 3.事务的传播行为使用例子 4.@Transactional注解失效的场景 5.总结 Transaction ...
最新文章
- 自定义控件:等比例显示控件RatioLayout
- junit 测试目录_JUnit 5测试中的临时目录
- PyOpenCV 坐标系统
- OpenCV的工具函数
- 中国国民休闲状况调查(2020)
- 政企联手打造智慧城市产业
- 单调栈与单调队列简单例题
- [Java] 蓝桥杯ALGO-64 算法训练 大小写判断
- 调用百度地图 API 移动地图时 maker 始终在地图中间 并根据maker 经纬度 返回地址...
- NSIS 封装软件工具封装的软件,安装后快捷方式没有图标显示问题
- 2016清华计算机学院复试名单,清华大学计算机系2016统考硕士拟录取名单
- UE4蓝图--人物的移动
- win7和手机共享文件和上网
- 解决多标签分类问题(包括案例研究)
- 十个拿来就能用的网页炫酷特效
- 查询水果价格(PTA-武理-C实验)
- 斯坦福CS224N学习笔记-10 机器翻译和注意力模型
- HDU-5755-Gambler Bo-高斯消元
- Word2016文档完美地在表格里的方框(□)中打钩(√)
- Pt100 三线电桥接法,三线横流源接法分析