4月17日总结
Spring中事务嵌套这么用一定得注意了!!
前言
最近项目上有一个使用事务相对复杂的业务场景报错了。在绝大多数情况下,都是风平浪静,没有问题。其实内在暗流涌动,在有些异常情况下就会报错,这种偶然性的问题很有可能就会在暴露到生产上造成事故,那究竟是怎么回事呢?
问题描述
我们用一个简单的例子模拟下,大家也可以看看下面这段代码输出的结果是什么。
在类SecondTransactionService定义一个简单接口transaction2,插入一个用户,同时必然会抛出错误
@Override
@Transactional(rollbackFor = Exception.class)
public void transaction2() {
System.out.println("do transaction2.....");
User user = new User("tx2", "111", 18);
// 插入一个用户
userService.insertUser(user);
// 跑错了
throw new RuntimeException();
}
在另外一个类FirstTransactionService定义一个接口transaction1,它调用transaction2方法,同时做了try catch处理
@Override
@Transactional(rollbackFor = Exception.class)
public void transaction1() {
System.out.println("do transaction1 .......");
try {
// 调用另外一个事务,try catch住
secondTransactionService.transaction2();
} catch (Exception e) {
e.printStackTrace();
}
// 插入当前用户tx1 User user = new User("tx1", "111", 18); userService.insertUser(user);
}
定义一个controller,调用transaction1方法
@GetMapping("/testNestedTx")
public String testNestedTx() {
firstTransactionService.transaction1();
return "success";
}
大家觉得调用这个http接口,最终数据库插入的是几条数据呢?
问题结果
正确答案是数据库插入了0条数据。
本文作者:lmyyyy
本文链接:https://www.cnblogs.com/lmyy/p/17342590.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步