这几个事务案例会回滚吗?最后一个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,分享外面看不到的干货!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
JavaSE面试题:泛型
开篇介绍 大家好,我是Java最全面试题库的提裤姐,今天这篇是面试系列的第六篇,主要总结了JavaSE中泛型相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。 一、什么是泛型? Java泛型( generics)是JDK 5中引⼊的⼀个新特性, 允许在定义类和接口的时候使⽤类型参数( type parameter) 。 声明的类型参数在使⽤时⽤具体的类型来替换。泛型最主要的应⽤是在JDK 5中的新集合类框架中。 泛型最⼤的好处是可以提⾼代码的复⽤性。以List接口为例,我们可以将String、 Integer等类型放⼊List中, 如不⽤泛型, 存放String类型要写⼀个List接口, 存放Integer要写另外⼀个List接口, 泛型可以很好的解决这个问题。 二、什么是类型擦除? 过类型参数合并,将泛型类型实例关联到同一份字节码上。 编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。 泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相...
-
下一篇
PostgreSQL使用Pgpool-II实现读写分离+负载均衡
作者:小麦苗 一、Pgpool-II 简介 官网:https://www.pgpool.net/mediawiki/index.php/Main_Page Pgpool-II是一个在PostgreSQL服务器和PostgreSQL数据库客户端之间工作的中间件。它是根据BSD许可证授权的。它提供以下功能。 连接池 Pgpool-II保存与PostgreSQL服务器的连接,并在具有相同属性(即用户名,数据库,协议版本)的新连接进入时重用它们。它减少了连接开销,并提高了系统的整体吞吐量。 复制 Pgpool-II可以管理多个PostgreSQL服务器。使用复制功能可以在2个或更多物理磁盘上创建实时备份,以便在磁盘发生故障时服务可以继续运行而不会停止服务器。 负载均衡 如果复制了数据库,则在任何服务器上执行SELECT查询都将返回相同的结果。Pgpool-II利用复制功能,通过在多个服务器之间分配SELECT查询来减少每个PostgreSQL服务器的负载,从而提高系统的整体吞吐量。充其量,性能与PostgreSQL服务器的数量成比例地提高。在许多用户同时执行许多查询的情况下,负载平衡最有效。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境