来源
这个问题是大概三年前,去面试的时候,面试官问我的问题,当时对这个问题是不清楚,平时开发工作的时候,只知道用到事务的方法上加上@Tranactionnal注解,甚至看别人的代 码使用了rollbackFor=Exception.class,(如下图所示)也会毫不犹豫的照抄过来,至于为什么暂且不问,
至少大家都是这么去写的,
自己的理解
随着工作的年限的增加,后来还是对于技术的好奇心驱使我不断探索技术背后的原理,其实
@Transactional是spring的aop实现的典型,通过cglib的动态代理去实现的的编程模式,
这个是众所周知的,我想回答的是@Transactional的rollbackFor为什么是RuntimeException的,
从下图可以看出TransactionAspectSupport的 invokeWithinTransaction方法中执行事务的的拦截,当发生异常的时候,执行回滚,
从最后一张图上可以看出,事务发生回滚的默认是判断RuntimeException或者Error异常,
这两个都属于Throwable,
最后一个问题,为什么受检异常不发生回滚呢? 答案非常简单,就是因为受检异常,
是编译期间需要try catch捕获的,而捕获的异常,事务执行是不会回滚的,
总结:
今天主要讲了@Transaction的回滚的机制,明白了这个之后, 以后看到第一张类似
写@Transaction(rollbackFor=Exception.class)是写代码对底层的不理解导致的。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END