上面这个问题源于前几日在咱们的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@NoArgsConstructorpublic 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会不会回滚?
@Transactionalpublic void test1() { userRepository.save(new User("AAA", 10)); throw new RuntimeException();}
问题二:test2会不会回滚?
@Transactionalpublic void test2() { userRepository.save(new User("AAA", 10)); try { throw new RuntimeException(); } catch (Exception e) { log.error("异样捕捉:", e); }}
问题三:test3会不会回滚?(第二句插入name超长)
@Transactionalpublic void test3() { userRepository.save(new User("BBB", 10)); userRepository.save(new User("123456", 20));}
问题四:test4会不会回滚?(第二句插入name超长)
@Transactionalpublic 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,分享其余中央看不到的常识与思考