SpringBoot事务不回滚问题
Spring声明式事务管理默认对 非检查型异常 或 运行时异常 进行事务回滚,而对检查型异常不进行回滚操作。
解释
java异常包括checked exception
(检查异常) 和 unchecked exception
(非检查异常),其中未检查异常又叫RuntimeException
(运行时异常),对于运行时异常,java
编译器不要求对异常进行处理(捕获或者抛出),但是对于checked exception
异常,必须要在方法里面捕获或者继续抛出。
上面一句话的意思就很明显了,spring默认对于运行时的异常进行捕获的,如果你在方法中添加了try{}catch{}
捕获了异常,则spring
是不会对事务进行回滚的,因为他默认你已经对异常进行了回滚,如果想要事务回滚,则必须在catch
中继续抛出异常。
注意
这里抛出的异常需要是RuntimeException
的子类,如果需要设置spring
也识别其他的异常并进行回滚,则需要设置作用在该方法上的@Transactional
注解的rollbackFor
属性。例如:
@Transaction(rollbackFor = MyException.class)
这里如果在方法中抛出的异常是MyExcepiton
的子类,事务也会进行回滚。
总结
如果异常被try{} catch{}
了,spring
就不回滚了,如果想让事务回滚,必须手动再抛出异常。
网友评论