乐趣区

关于java:这几个事务案例会回滚吗最后一个90的人判断错了

上面这个问题源于前几日在咱们的 Spring 技术交换群里,一个群友提出的对于事务回滚的疑难。

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

过后在群里说了后果和起因,但微信群范畴无限,所以独自写篇文章,拿进去给大家看看,顺便考考大家,对这块是否理解。

问题形容

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

你能够通过上面仓库中的 chapter3-4 目录获取根底工程:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

在这个工程中,定义一个名为 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,分享其余中央看不到的常识与思考

退出移动版