众所周知spring提供了声明式注解@Transactional,可以很方便的为我们项目提供事务管理,只要我们在类或者是方法上添加@Transactional注解即可,如下图所示:
这样我们的方法就都会被事务所管理咯,如果方法中遇到了异常也能够自动回滚,对于这些相信大家也都不陌生了吧.
但是在这里是有一个误区的,很多人都认为加上@Transactional注解就可以回滚所有的错误了,其实并不然.
在spring项目中,@Transactional注解默认会回滚运行时异常及其子类.,异常继承体系如下图
从图中可以看出RuntimeException是Exception异常的子类,那我们如果发生了Exception异常怎么办,答案是发生了Exception异常spring就不会帮你回滚咯
解决办法:
@Transactional(rollbackFor = Exception.class)
在@Transactional注解中加上rollbackFor属性,表示回滚的异常类型,设置Exception异常就回滚,这样不管是Exception还是RuntimeException,spring都能帮助我们去回滚数据了. 所以以后再类注解上加上@Transactional(rollbackFor = Exception.class)即可.