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

码林磷火
• 阅读 1693

下面这个问题源于前几日在我们的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,分享其他地方看不到的知识与思考
点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
3年前
分享一场Python正则表达式中的特殊序列问答交流
大家好,我是我是皮皮。一、前言前几天在Python最强王者交流群有个叫【杰】的粉丝问了一个关于Python正则表达式的问题,讨论十分火热,这里拿出来给大家分享下,一起学习。下图是原始题目:下面是给出的答案,乍看有点难懂,不过有正则狂魔【小王】大佬在,问题不大。二、解决过程这个这里给出【小王】大佬的解答,一起来看看吧,下面是他给的一个示例代码。import
Python进阶者 Python进阶者
2年前
怎么用Python把左边这种转成右边这种?
大家好,我是皮皮。一、前言前几天在Python白银交流群【惜君】问了一个Pandas处理Excel的问题,这里拿出来给大家分享下。下面是粉丝自己写的代码:二、实现过程看上去是分组,聚合。这里【此类生物】提出使用.sum().unstack()方法,可以得到
Aidan075 Aidan075
4年前
自动化办公 | 快速从Excel中提取图片并匹配命名
大家好,我是小五🐶关于自动化办公,之前我思考过好久。到底什么是自动化办公,哪些属于能真正提高我们工作效率的知识,哪些所谓的python自动化办公项目又是伪需求?其实挺难断定的,可能大部分人用不到的一个功能,对于刚需的人却是救命稻草!比如今天的这个需求👇案例需求一个群友在交流群里提出了这样一个问题这是他给出的示例文件,其中F列的商品编码,G列是商品图片。希望能
Wesley13 Wesley13
3年前
@Transactional注解失效的解决方案
一、前言  开发中我们经常使用@Transactional注解来启用Spring事务管理,但是如果使用方法不当,会遇到注解不生效该事务回滚的地方却没有回滚的问题。总结下一般是以下几个原因:1.@Transactional注解只能应用到public可见度的方法上。如果应用在protected、private或者p
Easter79 Easter79
3年前
Spring事务回滚情况
spring默认非嵌套调用的情况Spring框架的事务基础架构代码将默认地只在抛出运行时和uncheckedexceptions时才标识事务回滚。也就是说,当抛出一个RuntimeException或其子类例的实例时。(Errors也一样默认地标识事务回滚。)从事务方法中抛出的Checkedexceptions将不
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Python进阶者 Python进阶者
8个月前
群里大神帮看看我程序哪里错了?谢谢。我估计是isin这里出了问题,但找不到原因
大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【小马哥】问了一个Python自动化办公的问题。问题如下:群里大神帮看看我程序哪里错了?谢谢。我估计是isin这里出了问题,但找不到原因,我的期望是想在这个excel的M4格子里写一
Python进阶者 Python进阶者
3年前
盘点一个Python网络爬虫过程中中文乱码的问题
大家好,我是皮皮。一、前言前几天在Python黄金交流群有个叫【Mt.Everest】的粉丝问了一个关于Python网络爬虫过程中中文乱码的问题,这里拿出来给大家分享下,一起学习。二、解决过程这个问题其实很早之前,我就写过相关文章,而且屡试不爽。【Python进阶者】解答这里给出了两个思路,照着这个思路去的话,问题不大。事实上并不巧,还是翻车了。【黑
Python进阶者 Python进阶者
2年前
如果想要删除四列中都有相同项的数据,有什么方便的方法吗?
大家好,我是皮皮。一、前言前几天在Python最强王者交流群【WendyZheng】问了一个重复值删除的问题,这里拿出来给大家分享下。二、实现过程针对这个问题,【郑煜哲·Xiaopang】给了一个思路,使用dropduplicates(subset)去重。
Python进阶者 Python进阶者
2年前
盘点一个使用playwright实现网络爬虫的实战案例
大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Pyhton网络爬虫的问题,这里拿出来给大家分享下。二、实现过程【喜靓仔】提出用playwright实现,后来他自己给出了代码,如下图所示:代码如下:fromplaywright.sy
Python进阶者 Python进阶者
2年前
将字符串里的\x01,\x02这些替换掉用正则表达式无效?
大家好,我是皮皮。一、前言前几天在Python白银群【凡人不烦人】问了一个Python正则表达式的问题,这里拿出来给大家分享下。将字符串里的\x01,\x02这些替换掉用mystrre.sub(r'\x0d','',mystr)这个结果不对,是什么原因呢?