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条数据。

posted @ 2023-04-22 10:47  lmyyyy  阅读(13)  评论(0)    收藏  举报