下面这个问题源于前几日在我们的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,分享其他地方看不到的知识与思考
Dreamweaver 这一款专业的网页制作软件,相信相关专业的人员都不会陌生。可以说...
先看来一张图片,一张带有进度条效果的图片,或者美化一下,你可以当做是充电效...
1 概述 本文主要讲解了 Java 里面线程池的接口以及实现类,以及它们的基本使用方...
HTML+CSS 1.对WEB标准以及W3C的理解与认识 标签闭合、标签小写、不乱嵌套、提高...
基本html结构 输入 !+Enter !DOCTYPE htmlhtml lang=enhead meta charset=UTF-8 ...
1. Favicon.cc 在线制作ico图标网站,可以上传图片制作业,也可以利用网站提供的...
围绕文字、符号、链接三个方面,主要是中文,草拟的个人行文经验: 文字避免写错...
简介: 6月9日,开放平台企业 IT 治理联合云防火墙团队发布关于多账号管控的资源...
工作中很多时候需要对图片背景作处理,比如设置通透性,模糊处理等等 但是如果对...
前言 做为一个前端程序猿,肯定应该知道很多与前端相关的知识,像是 HTML 或是 J...