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

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

事物失效常见的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管理,类中的事物就不会被动态代理
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当年拼却醉颜红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值