为了能到远方,脚下的每一步都不能少.|

lmyyyy

园龄:2年8个月粉丝:7关注:10

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 中国大陆许可协议进行许可。

posted @   lmyyyy  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起