@Transactional注解中rollbackFor有什么作用?
先说结论吧,预防某些异常不是spring预想的异常,而导致事务没有进行回滚。
一般情况下,代码执行报错都会自动抛异常,而这个异常基本都是继承了Runtimeexception,在源码中也有相应内容,所以此时sql执行失败,会进行回滚。
假如抛出的异常不是Runtimeexception类型的异常,或者是和他是平级的异常,并且没有在注解中加入rollbankFor 那么此时可能就无法回滚了,源码中
也有相应体现。其实这个rolllbackFor目的就是为了扩大异常范围,在更大范围可以进行事务回滚而设立的一套机制。从使用时(rollbackFor=Exception.class)
也可以看出来一些。
避坑点有一个:如果代码中要抛出自定义异常,并且要求把事务进行回滚,那么就需要指定 rollbackFor=自定义异常 了。否则不会回滚,源码也有体现的,入口就是
代理transactioninteceptor中的invoke,详细的可根据代码推进,截图关键部分。