前言

  • 声明式事务是Spring功能中最爽之一,可是有些时候,我们在使用声明式事务并未生效,这是为什么呢?

  • 今天陈某带大家来聊一聊声明事务的几种失效场景。本文将会从以下两个方面来说一下事务为什么会失效?

  1. @Transactional介绍

  2. @Transactional失效场景

这是我历时三个月总结的 Java 面试 + Java 后端技术学习指南,本人这几年及春招的总结,目前,已经拿到了大厂offer,拿去不谢!(目录部分截图)

下载方式

1. 首先扫描下方二维码

2. 后台回复「Java面试」即可获取

@Transactional介绍

  • @Transactional是声明式事务的注解,可以被标记在类上接口方法上。

  • 该注解中有很多值得深入了解的几种属性,我们来看一下。

transactionManager

  • 指定事务管理器,值为bean的名称,这个主要用于多事务管理器情况下指定。比如多数据源配置的情况下。

isolation

  • 事务的隔离级别,默认是Isolation.DEFAULT

  • 几种值的含义如下:

    • Isolation.DEFAULT:事务默认的隔离级别,使用数据库默认的隔离级别。

    • Isolation.READ_UNCOMMITTED:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。

    • Isolation.READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。

    • Isolation.REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。

    • Isolation.SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

propagation

  • 代表事务的传播行为,默认值为Propagation.REQUIRED

  • Propagation.REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。比如A方法内部调用了B方法,此时B方法将会使用A方法的事务。

  • Propagation.MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

  • Propagation.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

  • Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  • Propagation.REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。比如A方法使用默认的事务传播属性,B方法使用REQUIRES_NEW,此时A方法在内部调用B方法,一旦A方法出现异常,A方法中的事务回滚了,但是B方法并没有回滚,因为A和B方法使用的不是同一个事务,B方法新建了一个事务。

  • Propagation.NESTED:支持当前事务,新增Savepoint点,也就是在进入子事务之前,父事务建立一个回滚点,与当前事务同步提交或回滚。子事务是父事务的一部分,在父事务还未提交时,子事务一定没有提交。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

timeout

  • 事务的超时时间,单位为秒。

readOnly

  • 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。如果一个事务只涉及到只读,可以设置为true。

rollbackFor 属性

  • 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。

  • 默认是在RuntimeExceptionError上回滚。

noRollbackFor

  • 抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。

@Transactional失效场景

  • 声明式事务失效的场景有很多,陈某这里只是罗列一下几种常见的场景。

底层数据库引擎不支持事务

  • 如果数据库引擎不支持事务,则Spring自然无法支持事务。

在非public修饰的方法使用

  • @Transactional注解使用的是AOP,在使用动态代理的时候只能针对public方法进行代理,源码依据在AbstractFallbackTransactionAttributeSource类中的computeTransactionAttribute方法中,如下:

protected TransactionAttribute computeTransactionAttribute(Method method,Class<?> targetClass) {// Don't allow no-public methods as required.if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {return null;
}
  • 此处如果不是标注在public修饰的方法上并不会抛出异常,但是会导致事务失效。

异常被 " 踹死了 "

  • 这种情况小白是最容易犯错的,在整个事务的方法中使用try-catch,导致异常无法抛出,自然会导致事务失效。伪代码如下:

@Transactional
public void method(){try{//插入一条数据//更改一条数据}catch(Exception ex){return;}
}

方法中调用同类的方法

  • 简单的说就是一个类中的A方法(未标注声明式事务)在内部调用了B方法(标注了声明式事务),这样会导致B方法中的事务失效。

  • 代码如下:

public class Test{public void A(){//插入一条数据//调用B方法B();}@Transactionalpublic void B(){//插入数据}
}
  • 为什么会失效呢?:其实原因很简单,Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。

  • 如何解决呢?:这就涉及到注解失效的原因了,后续文章会介绍到,这里不过多介绍了。

rollbackFor属性设置错误

  • 很容易理解,指定异常触发回滚,一旦设置错误,导致一些异常不能触发回滚,此时的声明式事务不就失效了吗。

noRollbackFor属性设置错误

  • 这个和rollbackFor属性设置错误类似,一旦设置错误,也会导致异常不能触发回滚,此时的声明式事务会失效。

propagation属性设置错误

  • 事务的传播属性在上面已经介绍了,默认的事务传播属性是Propagation.REQUIRED,但是一旦配置了错误的传播属性,也是会导致事务失效,如下三种配置将会导致事务失效:

    • Propagation.SUPPORTS

    • Propagation.NOT_SUPPORTED

    • Propagation.NEVER

原始SSM项目,重复扫描导致事务失效

  • 在原始的SSM项目中都配置了context:component-scan并且同时扫描了service层,此时事务将会失效。

  • 按照Spring配置文件的加载顺序来说,会先加载Springmvc的配置文件,如果在加载Springmvc配置文件的时候把service也加载了,但是此时事务还没加载,将会导致事务无法成功生效。

  • 解决方法很简单,把扫描service层的配置设置在Spring配置文件或者其他配置文件中即可。

总结

  • 事务失效的原因很多,但是千万不要做到一知半解,只有深入理解了,才能在面试过程中对答如流。

  • 今天的文章就到此结束了,如果觉得陈某写得不错,有所收获的,关注在看来一波,你们的鼓励,将会是我写作的动力,谢谢支持!!!

最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了大厂offer,拿去不谢!(目录部分截图)

下载方式

1. 首先扫描下方二维码

2. 后台回复「Java面试」即可获取

面试官:你知道哪几种事务失效的场景?相关推荐

  1. 面试官:说出八种消息队列的应用场景。啊?八种?

    本文来源于公众号:胖滚猪学编程.转载请注明出处! 一个风度翩翩,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向她走来,看着铮亮的头,胖滚猪心想,这肯定是尼玛顶级架构师吧!完了要挂了. 结果面试官第 ...

  2. 面试官最讨厌的三种求职者

    职场人士在职业职业生涯中一定会面临求职和面试,想要面试过关需要三个条件:职业技能达标.问题回答得体.不犯致命错误.前两点很好理解,我们来看看第三个,面试过程中有些致命的错误表现,会让面试官反感,直接毙 ...

  3. 面试官:Spring事务失效的场景有哪些?如何解决?

     作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...

  4. 面试官问:你讲讲分布式事务问题的几种方案?

    面试题 1.分布式事务了解吗? 2.你们是如何解决分布式事务问题的? 面试官心理分析 只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑,你起码得知道有哪些方案,一般怎么 ...

  5. 跟面试官侃了半小时 MySQL 事务,把原子性、一致性、持久性的实现都讲完了

    来源 | 阿丸笔记 封图| CSDN下载于视觉中国 提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID ...

  6. 面试官:你说对MySQL事务很熟?那我问你10个问题

    大部分人学习和工作中用惯了CRUD,对面试官刨根问底的灵魂拷问你还能对答如流吗?我们有必要了解一些更深层次的数据库基础原理. 整理了面试中,关于MySQL事务和存储引擎10个FAQ(Frequentl ...

  7. 面试官:你说对 MySQL 事务很熟?那我问你 10 个问题

    作者 | LemonCoder 责编 | 胡巍巍 本文系作者投稿 学习关系型数据库MySQL是很好的切入点,大部分人学习和工作中用惯了CRUD,对面试官刨根问底的灵魂拷问你还能对答如流吗?我们有必要了 ...

  8. 小白面试:EF Core的三种事务

    有一次小白面试回来说,面试官问EF Core怎么实现,他当时懵逼了,之前写过但是长时间不用了,最近的事务还是用第三方封装的方法,早忘记原生的怎么写了.本文将替小白回答这个问题,而且有三种实现方法. 事 ...

  9. 京东面试官问我:“聊聊MySql事务,MVCC?”

    大家好,今天来分享一个京东面试真题,也是这是我前阵子听我工位旁边高T(高,实在是高)面试候选人的时候问的一个问题,他问,你能说说 mysql的事务吗?MVCC有了解吗? 话不多说,直接开干 事务定义及 ...

最新文章

  1. centos6配置日志外发_CentOS6下记录后台操作日志的两种方式
  2. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问
  3. 微软Azure开源开发者(深圳)峰会等你来
  4. vue组件详解(一)——组件与复用
  5. 机器学习 深度学习 ai_如何突破AI炒作成为机器学习工程师
  6. JAVA入门级教学之(逻辑(布尔)运算符)
  7. apt-get包管理详解
  8. 【ECCV2020】接收论文列表part1
  9. mysql 行转列_详解MySQL行列转换4个实现方案及反向行转列实验测试
  10. gpg: 找不到有效的 openpgp 数据。_萤火数据|找主播堪比相亲找对象,该如何避免心酸血泪史?...
  11. python中的tail()_让VASP实现固定应力张量计算的python脚本
  12. 三个数互质 java_LeetCode 5198. 丑数 III(Java)容斥原理和二分查找
  13. Minix、UNIX、Linux的区别与联系
  14. node下运行js文件实时更新文件变化
  15. 2021-02-10微软漏洞通告
  16. ipad能不能装python_ipad能下载python么
  17. python3 输出中文、日文等等乱码问题的解决办法
  18. windows下安装php环境(wampserver)
  19. 2023湖南省“楚怡杯”职业技能大赛“网络安全” 项目比赛任务书
  20. 宕昌一中2021高考成绩查询,有朋自远方来 | 甘肃省陇南市宕昌一中来广元中学考察交流...

热门文章

  1. 获取ISAPI_Rewrite重写后的URL
  2. stm32f103rb升级到stm32f103rc时代码移植注意事项
  3. C++ exception 类继承结构图
  4. CentOS7安装Docker详细教程
  5. php写接口的注意事项,接口的调用注意事项
  6. python 语言教程(3)变量
  7. C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配标志
  8. EOS账户系统(8)密钥被盗恢复
  9. (chap7 确保WEB安全的HTTPS) HTTPS和SSL
  10. python通过requirements.txt文件批量安装依赖包的实现步骤