SpringBoot事务回滚问题

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就不回滚了,如果想让事务回滚,必须手动再抛出异常。

你可能感兴趣的:(SpringBoot事务回滚问题)