并发安全问题之--事物失效问题

并发安全问题之--事物失效问题

事物失效常见的6种原因:

1、事物方法非public修饰

2、非事物方法调用事物方法

3、事物方法抛出的异常被捕获了

4、事物方法抛出的异常类型不对

5、事物传播行为不对(事物发生嵌套时有事物传播)

6、事物锁属类没有被spring管理

1、事物方法非public修饰

spring事物是基于AOP的方式结合动态代理实现的,只有public的方法才能被进行动态代理

2、非事物方法调用事物方法

非事物方法调用事物是this即本类去调用,就是普通类调用普通方法,不是动态代理的事物方法

3、事物方法抛出的异常被捕获了

Spring事物管理是通过捕获方法抛出的异常来触发事物回滚,如果异常被捕获而没有再抛出就不会触发事物回滚

4、事物方法抛出的异常类型不对

Spring的事务管理默认感知的异常类型是RuntimeException,当事务方法内部抛出了一个IOException时,不会被Spring捕获,因此就不会触发事务回滚,事务就失效了。

一般通过rollbackFor属性指定要感知的异常类型,@Transactional(rollbackFor = Exception.class)

5、事物传播行为不对(事物发生嵌套时有事物传播)

事物默认的传播行为是REQUIRES类型,内外事物都是REQUIRES类型就会合并事物,而内部事物如果使用了REQUIRES_NEW就会开启一个新事物,

不会合并,当其他内部事物回滚时不会让他回滚。

在示例代码中,事务的入口是createOrder()方法,会开启一个事务,可以成为外部事务。在createOrder()方法内部又调用了insertOrder()方法和reduceStock()方法。这两个都是事务方法。

不过,reduceStock()方法的事务传播行为是REQUIRES_NEW,这会导致在进入reduceStock()方法时会创建一个新的事务,可以成为子事务。insertOrder()则是默认,因此会与createOrder()合并事务。

因此,当createOrder方法最后抛出异常时,只会导致insertOrder方法回滚,而不会导致reduceStock方法回滚,因为reduceStock是一个独立事务。

所以,一定要慎用传播行为,注意外部事务与内部事务之间的关系。

6、事物锁属类没有被spring管理

类不被spring管理,类中的事物就不会被动态代理

相关推荐
施嘉伟34 分钟前
Oracle 11g RAC ASM磁盘组剔盘、加盘实施过程
数据库·oracle
橘猫云计算机设计2 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
卓怡学长2 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
冰^3 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
电商数据girl3 小时前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理
Spring小子4 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
溜溜刘@♞5 小时前
数据库之mysql优化
数据库·mysql
uwvwko6 小时前
ctfhow——web入门214~218(时间盲注开始)
前端·数据库·mysql·ctf
柯3496 小时前
Redis的过期删除策略和内存淘汰策略
数据库·redis·lfu·lru
皮实的芒果6 小时前
前端实时通信方案对比:WebSocket vs SSE vs setInterval 轮询
前端·javascript·性能优化