我来出个题:这个事务会不会回滚?

简介: 我来出个题:这个事务会不会回滚?

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

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

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

问题描述

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

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

在这个工程中,定义一个名为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. 题目有点偏,也许你日常也不会这样写,但希望这个出乎意料的结果,可以引导你跟踪源码一探究竟的欲望!

目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
MySQL基础:事务
本文详细介绍了数据库事务的概念及操作,包括事务的定义、开启、提交与回滚。事务作为一组不可分割的操作集合,确保了数据的一致性和完整性。文章还探讨了事务的四大特性(原子性、一致性、隔离性、持久性),并分析了并发事务可能引发的问题及其解决方案,如脏读、不可重复读和幻读。最后,详细讲解了不同事务隔离级别的特点和应用场景。
158 4
MySQL基础:事务
|
SQL 消息中间件 数据库
带你读懂事务(下)、分布式事务
带你读懂事务(下)、分布式事务
97 0
|
存储 缓存 Java
每日一博 - 常见的Spring事务失效&事务不回滚案例集锦
每日一博 - 常见的Spring事务失效&事务不回滚案例集锦
181 0
|
SQL 关系型数据库 MySQL
MySQL基础-事务
什么是事务
106 0
|
开发工具 git
回滚代码
回滚代码
314 0
回滚代码
|
SQL 关系型数据库 MySQL
MySQL基础-事务(一)
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
163 0
|
NoSQL Redis 开发者
事务-事务的工作流程|学习笔记
快速学习事务-事务的工作流程
事务-事务的工作流程|学习笔记
|
SQL 存储 安全
MySQL基础:事务篇
MySQL基础:事务篇
|
缓存 NoSQL Java
让人头痛的大事务问题到底要如何解决?
让人头痛的大事务问题到底要如何解决?
让人头痛的大事务问题到底要如何解决?