菜单

曾嘉诚
发布于 2025-01-13 / 8 阅读
0
0

spring事务失效的场景

情况一:异常捕获处理

当发生异常捕获时,spring事务将会失效

代码示例:

这里 int a = 1/0;会报出一个错误异常,将会导致事务失效

原因

事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉

解决方案

在捕获异常后抛出

情况二:抛出检查异常

在Java中,异常分为两类:检查型异常(Checked Exceptions)和运行时异常(Runtime Exceptions)。检查型异常是编译器要求必须处理的异常,而运行时异常则是在运行时可能发生的异常。

代码示例

这里new FilelnputStream("dddd");会抛出一个检查异常,这里我们选择使用throws FileNotFoundException将其抛出,这样会导致spring事务的失效,事务无法回滚

原因

spring默认只会回滚非检查异常

解决方案

在@Transactional配置属性rollbackFor=Exception.class,这样会让发生所有异常都回滚事务

情况三:非public方法导致异常失效

代码示例:

方法的访问权限为默认,这样也会导致事务失效

原因

Spring 为方法创建代理、添加事务通知、前提条件都是该方法是 public 的

解决方案

添加public访问权限修饰符


评论