【259期】面试官:Spring事务失效的场景有哪些?如何解决?

【259期】面试官:Spring事务失效的场景有哪些?如何解决?

实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制;好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Spring事务失效的场景,希望开发过程尽量避免踩坑,造成时间精力的浪费。

溪源按照最基本的使用方式以及常见失效场景优先级整理,先简单介绍一下具体失效场景:

  • 注解@Transactional配置的方法非public权限修饰;
  • 注解@Transactional所在类非Spring容器管理的bean;
  • 注解@Transactional所在类中,注解修饰的方法被类内部方法调用;
  • 业务代码抛出异常类型非RuntimeException,事务失效;
  • 业务代码中存在异常时,使用try…catch…语句块捕获,而catch语句块没有throw new RuntimeExecption异常;(最难被排查到问题且容易忽略)
  • 注解@Transactional中Propagation属性值设置错误即Propagation.NOT_SUPPORTED(一般不会设置此种传播机制)
  • mysql关系型数据库,且存储引擎是MyISAM而非InnoDB,则事务会不起作用(基本开发中不会遇到);

下面基于以上场景,溪源给小伙伴们详细解释;

非public权限修饰

参考Spring官方文档介绍,摘要、译文如下:

When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.

译文

使用代理时,您应该只将@Transactional注释应用于具有公共可见性的方法。如果使用@Transactional注释对受保护的、私有的或包可见的方法进行注释,则不会引发错误,但带注释的方法不会显示配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(见下文)。

简言之:@Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

目前,如果@Transactional注解作用在非public方法上,编译器也会给与明显的提示,如图:

【259期】面试官:Spring事务失效的场景有哪些?如何解决?

非Spring容器管理的bean

基于这种失效场景,有工作经验的大佬基本上是不会存在这种错误的;@Service 注解注释,StudentServiceImpl 类则不会被Spring容器管理,因此即使方法被@Transactional注解修饰,事务也亦然不会生效。

简单举例如下:

 @Transactional(propagation = Propagation.NOT_SUPPORTED,rollbackFor = Exception.class)
    public void insertClassByException(ClassDo classDo
{
        classMapper.insertClass(classDo);
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

数据库存储引擎不支持事务

MySQL关系型数据为例,如果其存储引擎设置为 MyISAM,则事务失效,因为MyISMA 引擎是不支持事务操作的;

故若要事务生效,则需要设置存储引擎为InnoDB ;目前 MySQL 从5.5.5版本开始默认存储引擎是:InnoDB;

来源:blog.csdn.net/xuan_lu/article/details/107797505

END

十期推荐

【241期】面试官:你了解JVM中的ZGC垃圾收集器吗?
【242期】面试官:Spring AOP有哪些通知类型,它们的执行顺序是怎样的?
【243期】面试官:什么是前缀索引、为什么要用前缀使用、用在什么场景下?
【244期】万字+图解 Redis,面试不用愁了!
【245期】面试官:MySQL发生死锁有哪些原因,怎么避免?
【246期】面试官:说说你对 RabbitMQ 的理解以及使用它的场景
【247期】记一次Java面试中遇到的三个问题及感悟!
【248期】面试官:你能说几个Java8中Stream对列表去重的方法吗?
【249期】关于Java中的异常,面试可以问的都在这里了!
【250期】关于Mybatis知识点,面试可以问的都在这里了!


与其在网上拼命找题? 不如马上关注我们~

【259期】面试官:Spring事务失效的场景有哪些?如何解决?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/8094.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!