一口气怼完12种@Transactional的失效场景

本文探讨了Spring框架中@Transactional注解在不同场景下可能失效的12种情况,包括代理不生效、框架或底层不支持的功能、错误使用@Transactional等方面,通过实例分析了如何避免这些问题并确保事务的正确管理。
摘要由CSDN通过智能技术生成

一口气怼完12种@Transactional的失效场景

数据库事务是后端开发中不可缺少的一块知识点。Spring为了更好的支撑我们进行数据库操作,在框架中支持了两种事务管理的方式:

  • 编程式事务
  • 声明式事务

日常我们进行业务开发时,基本上使用的都是声明式事务,即为使用@Transactional注解的方式。

常规使用时,Spring能帮我们很好的实现数据库的ACID (这里需要注意哦,Spring只是进行了编程上的事务,最终数据上的事务还是有数据库实现的) 。

但是,只要是人写的代码,就一定会有Bug。

如果我们不了解@Transactional的失效场景或者说踩坑点,那么在业务开发的过程中总是会出现一些匪夷所思的Bug。

同样它也是面试时高频的考点哦!

本文将罗列@Transactional的失效场景,并分析其失效原因。

一、失效场景集一:代理不生效

Spring中对注解解析的尿性都是基于代理的,如果目标方法无法被Spring代理到,那么它将无法被Spring进行事务管理。

Spring生成代理的方式有两种:

  1. 基于接口的JDK动态代理,要求目标代理类需要实现一个接口才能被代理
  2. 基于实现目标类子类的CGLIB代理

Spring在2.0之前,目标类如果实现了接口,则使用JDK动态代理方式,否则通过CGLIB子类的方式生成代理。

而在2.0版本之后,如果不在配置文件中显示的指定
spring.aop.proxy-tartget-class的值,默认情况下生成代理的方式为CGLIB,如下图

一口气怼完12种@Transactional的失效场景

顺着代理的思路,我们来看看哪些情况会因为代理不生效导致事务管控失败。

(1)将注解标注在接口方法上

@Transactional是支持标注在方法与类上的。一旦标注在接口上,对应接口实现类的代理方式如果是CGLIB,将通过生成子类的方式生成目标类的代理,将无法解析到@Transactional,从而事务失效。

这种错误我们还是犯得比较少的,基本上我们都会将注解标注在接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值