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

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

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

问题描述

这个问题的基础工程我用了之前Spring Boot 2.x基础教程中《使用Spring Data JPA访问MySQL》(https://blog.didispace.com/spring-boot-learning-21-3-4/)的案例。

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

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

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

在这个工程中,定义一个名为User的实体:

@Entity
@Data
@NoArgsConstructor
public class User {@Id@GeneratedValueprivate 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("AAA", 10));userRepository.save(new User("1234567890", 20));
}

问题四:test4会不会回滚?(第二句插入name超长)

@Transactional
public void test4() {userRepository.save(new User("AAA", 10));try {userRepository.save(new User("1234567890", 20));} catch (Exception e) {log.error("异常捕获:", e);}
}

做个投票,选择你认为的答案(多选):

点击卡片关注我,回复“事务回滚

获取答案,看看你的判断都对吗?

留言说说你错了哪题?看看大家是不是都一样 

如果你觉得这个题可以,转发到朋友圈,考考你身边的人吧

我来出个题:这些事务会不会回滚?大概率你会错!相关推荐

  1. 群友:事务中的异常不也抛出了,为什么没catch到而回滚?

    上周,我们通过这篇文章<为什么catch了异常,但事务还是回滚了?>(https://blog.didispace.com/why-catch-exception-transaction- ...

  2. Spring事务管理中异常回滚知识点总结

    记录总结Spring核心知识点:事务使用与它的传播机制 目录 前言 问题场景 Spring 管理事务的原理 MySQL中的事务管理 JDBC中的事务管理 Spring 中的事务管理 Spring中的事 ...

  3. Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚)

    Java-JDBC[之]事务介绍.事务特性.操作事务(事务提交.异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4. ...

  4. Spring事务捕获异常后依旧回滚

    前沿 一段生产事故发人深省,在Spring的声明式事务中手动捕获异常,居然判定回滚了,这是什么操作?话不多说直接上代码 @Service public class A {@Autowiredpriva ...

  5. oracle表结构修改回滚,87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚...

    87.Oracle数据库SQL开发之 修改表内存--数据库事务的提交和回滚 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元. 要永久性的记录事务中SQL语句的 ...

  6. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

  7. Spring事务总结(一) 内部调用事务失效、异常回滚

    Spring事务总结(一) 内部调用事务失效.异常回滚 参考文章: (1)Spring事务总结(一) 内部调用事务失效.异常回滚 (2)https://www.cnblogs.com/gss128/p ...

  8. java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析

    用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...

  9. MySQL:事务:开启、回滚与提交

    这里,我们使用 set session autocommit=0,修改当前会话的事务提交方式.autocommit变量有两个可选值:ON与OFF,ON代表事务是自动提交,OFF代表不自动提交.roll ...

最新文章

  1. 策略模式(封装一系列的功能,使之可以相互替换)
  2. 对java面试文章的技术漫谈的C#技术理解
  3. 服务器怎么清除日志文件,如何清理服务器数据库日志文件
  4. sqlserver 实现数据库全文检索
  5. 运维监控工具之 Nagios 客户端安装(二)
  6. 安卓 linux找回内置存储,Android手机自带内部存储路径的获取
  7. android滑动基础篇 TouchView
  8. Liunx 环境 docker-安装redis11
  9. Java语言程序设计(基础篇)课后答案
  10. Wei Yang Bryan Lim, etc. Federated Learning in Mobile Edge Networks: A Comprehensive Survey.
  11. java 字符长度判断_java判断中文字符串长度的简单实例
  12. mysql全量备份脚本_mysql全量备份脚本
  13. 易基因|靶基因DNA甲基化测序(Target-BS)
  14. 清华大学计算机系刘斌,queueing刘斌,男,工学博士 ,清华大学计算机科学与技...
  15. win10桌面计算机打不开,win10桌面此电脑右键管理打不开处理方法
  16. 提升程序员工作效率的6个工具利器
  17. LTE网络RLC层的polling机制
  18. 微信怎样将图片上的文字变成文档
  19. Java:Java和C有什么区别?
  20. IT痴汉的工作现状30-刀客许三爷(下)

热门文章

  1. 请注意Tokyo Tyrant (ttserver)在大数据量下的不稳定
  2. python3 字符串 和 列表(list)互相转换
  3. linux 设备管理工具 udev 规则编写
  4. linux sudo 实现原理
  5. 智能合约的48个应用场景介绍
  6. 数字货币 分层确定性钱包(HD Wallets)
  7. 区块链 重放攻击 简介
  8. linux内核 current当前进程指针 task_struct结构介绍
  9. warning C4251 needs to have dll-interface解决办法
  10. win32 debug api 原理