• 这几个事务案例会回滚吗?最后一个90%的人判断错了...


    下面这个问题源于前几日在我们的Spring技术交流群里,一个群友提出的关于事务回滚的疑问。

    在讨论过程中,我尝试去复现群友提出的问题场景,发现了另外一个可能让大家会迷惑的情况。

    当时在群里说了结果和原因,但微信群范围有限,所以单独写篇文章,拿出来给大家看看,顺便考考大家,对这块是否了解。

    问题描述

    这个问题的基础工程我用了之前Spring Boot 2.x基础教程中《使用Spring Data JPA访问MySQL》的案例。

    你可以通过下面仓库中的chapter3-4目录获取基础工程:

    在这个工程中,定义一个名为User的实体:

    @Entity
    @Data
    @NoArgsConstructor
    public class User {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Size(max = 5)
        private String name;
        @Max(50)
        private Integer age;
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
    }
    

    这里name设置了长度为5,这样可以通过insert语句中的name超长,让其抛出异常,从而可以测试事务的触发。

    另外工程中还包含了Spring Data Jpa的数据访问对象UserRepository,用来实现对User实体的数据操作,这里就不放具体代码了。

    问题来了

    这里数据库采用MySQL 5.7,存储引擎为InnoDB,使用默认事务级别。

    下面来调整下这四个问题吧:

    问题一:test1会不会回滚?

    @Transactional
    public void test1() {
        userRepository.save(new User("AAA", 10));
        throw new RuntimeException();
    }
    

    问题二:test2会不会回滚?

    @Transactional
    public void test2() {
        userRepository.save(new User("AAA", 10));
        try {
            throw new RuntimeException();
        } catch (Exception e) {
            log.error("异常捕获:", e);
        }
    }
    

    问题三:test3会不会回滚?(第二句插入name超长)

    @Transactional
    public void test3() {
        userRepository.save(new User("BBB", 10));
        userRepository.save(new User("123456", 20));
    }
    

    问题四:test4会不会回滚?(第二句插入name超长)

    @Transactional
    public void test4() {
        userRepository.save(new User("BBB", 10));
        try {
            userRepository.save(new User("123456", 20));
        } catch (Exception e) {
            log.error("异常捕获:", e);
        }
    }
    

    留言说说你的答案吧,这四个都会不会回滚?

    提示test4比较特殊哦!先给点时间思考一下,不要走开,记得关注我,下一篇公布答案和原因!如果你实在已经饥渴难耐,那么可以关注公众号:程序猿DD,回复“事务回滚”,获取正确答案。看看你的判断都对吗?

    如果你质疑给出的答案,强烈建议下载文章的案例,然后写几行代码,试试这几种情况哦!还不敢相信的话,那就debug一探究竟吧!

    P.S. 题目有点偏,也许你日常也不会这样写,但希望这个出乎意料的结果,可以引导你跟踪源码一探究竟的欲望!

    欢迎关注我的公众号:程序猿DD,分享外面看不到的干货与思考!

  • 相关阅读:
    oracle 日期函数
    SharpDevelop学习笔记(5)—— AddIns系统详解
    C#3.0 为我们带来什么(2) —— 自动属性
    SharpDevelop学习笔记(6)—— AddIn构建指南
    SharpDevelp2.0学习笔记(1)——SharpDevelp简单介绍
    对象数组根据某属性列的灵活排序
    SharpDevelop学习笔记(4)——SharpDevelop的核心
    也谈2007
    SharpDevelop学习笔记(2)——体系结构
    C#3.0 为我们带来什么(1) —— LINQ之Lambda
  • 原文地址:https://www.cnblogs.com/didispace/p/14953078.html
Copyright © 2020-2023  润新知