Spring事务十种失效场景

首先我们要明白什么是事务?它的作用是什么?它在什么场景下在Spring框架下会失效?

事务:本质上是由数据库和程序之间交互的过程中的衍生物,它是一种控制数据的行为规则。有几个特性

1、原子性:执行单元内,要么都执行,要么都不执行,不能说执行一半,剩下一半不执行了

2、一致性:意味着一旦发生数据变化,在数据执行单元内,要么都成功,要么数据都回滚到在单元内操作之前的数据。

3、隔离性:并发访问时,每个人拿到的事务id是不一致的,而每个人对数据的操作是相互隔离的,这个比较深奥,后面单独再讲讲数据库的隔离级别

4、持久性:表示的是事务一旦提交,对数据库的影响是永久的

正因为有了事务控制,我们才能对数据正确的处理,查阅,但是如果用不好事务,也会给我们的数据造成预期之外的结果。

下面我们说一下在Spring框架中哪些场景我们使用@Transactional会失效


1、事务未被Spring容器管理

     例如实现类未加@Service注解,没有注入到Spring容器

2、事务方法被final修饰

      会导致Spring生成的代理类无法重写该方法,因而导致事务失效

3、事务管控的方法非public修饰

     本质还是由于Spring生成的代理类无法访问该方法,权限不足

4、同类中方法互相调用

    A调用B方法,A未被事务注解管控,会导致B事务也失效

5、设定的事务传播类型不支持事务

    如果设定的事务传播类型@Transactional(propagation= Propagation.NOT_SUPPORTED)不支持事务,则事务也会失效

6、异常被吞噬

      程序异常未抛出,被catch,事务会感知不到,从而事务失效

7、数据库不支持事务

    数据库本身不支持事务,如mysql存储引擎为Myisam就不支持事务

8、项目未配置开启事务

    未配置Spring事务管理器,像@EnableTransactionManagement注解未配置,或者

9、错误的事务传播特性

        如果设置了Propagation.NEVER,这种传播特性是不支持事务的,如果存在事务则报错

10、多线程调用

        事务管控的方法开启多线程调用,事务id不在当前线程,则是无法事务回滚的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值