likes
comments
collection
share

@Tranactional注解rollbackFor为什么默认是RuntimeException?

作者站长头像
站长
· 阅读数 60

来源

这个问题是大概三年前,去面试的时候,面试官问我的问题,当时对这个问题是不清楚,平时开发工作的时候,只知道用到事务的方法上加上@Tranactionnal注解,甚至看别人的代 码使用了rollbackFor=Exception.class,(如下图所示)也会毫不犹豫的照抄过来,至于为什么暂且不问, 至少大家都是这么去写的, @Tranactional注解rollbackFor为什么默认是RuntimeException?

自己的理解

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

@Tranactional注解rollbackFor为什么默认是RuntimeException?

@Tranactional注解rollbackFor为什么默认是RuntimeException?

@Tranactional注解rollbackFor为什么默认是RuntimeException?

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

转载自:https://juejin.cn/post/6959105827223552007
评论
请登录