记一次 Spring 事务配置踩坑记
2023-09-27 14:24:04 时间
业务逻辑伪代码如下。理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条件会不满足,会查询不到数据。结果事与愿违,后一次的查询,居然查到了数据。
void saveXxx(){
xxService.getXxx(); // 查到一条数据 data1
xxService.insert(); // 插入一条数据 t1
xxService.getXxx(); // 查到一条数据 data1
}
分析过程:
抛弃业务逻辑,在一个新的 service 中写了一个最简单的测试,查询 --> 插入 --> 查询。为了保证两者具有可比性,sql 都从原 Mapper 中拷贝过去。但是依然重现不了问题。神奇的是出现了如下的情况:
理论上,yyService.getYyy() 与 xxService.getXxx() 应该都查不到数据才对,结果只有 xxService.getXxx() 能查到。
开始怀疑事务的问题,是不是 xxService.getXxx() 新开启了一个事务去查询,只有这样,xxService.getXxx() 的查询条件才不受当前事务插入的数据所影响。
检查项目中的事务配置,除了配置了注解式事务外,还有如下的声明式事务配置:
就是这一行配置搞的鬼:readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED ); get*开头的方法都加了只读事务,而只读事务是以非事务方式运行,如果当前存在事务,则把当前事务挂起。
这样就解释了为什么 xxService.getXxx() 方法能够查到数据了,它是在当前事务之外查询的数据。
解决办法:
将 readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED ); 去掉。
相关文章
- Spring 使用xml文件、注解配置Bean
- 深入实践Spring Boot2.1.1 MySQL依赖配置
- 深入实践Spring Boot2.4.1 Neo4j依赖配置
- Spring: 配置声明式事务
- springBoot 入门(二)—— 使用 spring.profiles.active来区分配置
- spring MongoDB 配置以及开启事务
- Spring学习-3-Bean配置
- Dubbo 3.0.6 + Nacos 2.0.4 配置 + spring boot 2.6.4
- Spring Cloud Config 实现配置中心,看这一篇就够了
- Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置
- Spring Cloud Config采用Git存储时两种常用的配置策略
- Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
- spring外部化配置
- Spring声明式事务(xml配置事务方式)
- spring cloud 2020.0.1踩坑记录-bootstrap不生效等
- spring框架漏洞整理(Spring Boot Actuator命令执行漏洞)
- Eclipse开发环境设置(Maven+Spring MVC+Flex)
- Spring声明式事务配置管理方法
- 配置 google app 配置 spring. 配置jdo
- spring cloud 搭建(配置中心)
- 【spring mvc】spring-mvc配置
- spring boot自动配置之jdbc
- spring配置中classpath: 与classpath*:的区别
- spring boot 日志配置 默认的日志配置
- Spring Boot 2.X 配置 MySQL