@Tranactional注解rollbackFor为何默认是RuntimeException?

来源

这个问题是大概三年前,去面试的时候,面试官问个人问题,当时对这个问题是不清楚,平时开发工做的时候,只知道用到事务的方法上加上@Tranactionnal注解,甚至看别人的代 码使用了rollbackFor=Exception.class,(以下图所示)也会坚决果断的照抄过来,至于为何暂且不问, 至少你们都是这么去写的, image.png面试

本身的理解

随着工做的年限的增长,后来仍是对于技术的好奇心驱使我不断探索技术背后的原理,其实 @Transactional是spring的aop实现的典型,经过cglib的动态代理去实现的的编程模式, 这个是众所周知的,我想回答的是@Transactional的rollbackFor为何是RuntimeException的, 从下图能够看出TransactionAspectSupport的 invokeWithinTransaction方法中执行事务的的拦截,当发生异常的时候,执行回滚, 从最后一张图上能够看出,事务发生回滚的默认是判断RuntimeException或者Error异常, 这两个都属于Throwable,
最后一个问题,为何受检异常不发生回滚呢? 答案很是简单,就是由于受检异常, 是编译期间须要try catch捕获的,而捕获的异常,事务执行是不会回滚的,spring

image.png

image.png

image.png

总结:
今天主要讲了@Transaction的回滚的机制,明白了这个以后, 之后看到第一张相似 写@Transaction(rollbackFor=Exception.class)是写代码对底层的不理解致使的。编程