目的:记录@Transactional注解遇到的问题
Spring事务漫谈
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
// 只看Transactional注解中的两个属性,其他的省略
// 默认事务的传播行为是加入当前的事务中(如果存在事务的话)
Propagation propagation() default Propagation.REQUIRED;
// 默认的事务回滚异常是无的
Class<? extends Throwable>[] rollbackFor() default {};
// ... 其他属性
}
// 示例
public class FooServiceImpl implements FooService {
// 这样的事务回滚除非是unchecked Exception或者Error才会回滚,其他异常不回滚
@Transactional
public void service() {
// TODO
}
}
@Transactional默认对unchecked Exception和Error进行回滚说明
@Transactional的回滚异常类型没有指定,则默认是没有,@Transactional的rollbackFor默认属性值是{}。
那为什么会对unchecked Exception和Error异常进行回滚,不对其他的checked Exception进行回滚呢?
查看这个方法org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(Method, Class<?>, InvocationCallback)
首先会创建一个事务相关的修饰类,其次查看捕获执行代理方法异常的处理方法completeTransactionAfterThrowing
txInfo.transactionAttribute.rollbackOn(ex)这个方法就是处理捕获的异常。org.springframework.transaction.interceptor.DefaultTransactionAttribute
在Spring中DefaultTransactionAttribute子类会有对捕获的异常处理方式,决定是否会要回滚。如果子类的匹配不到,则默认会调用父类的该方法,这也说明为什么如果只在方法上使用@Transactional注解不指定回滚的异常,会对unchecked Exception和Error进行回滚而不对checked Exception进行回滚的原因。如:org.springframework.transaction.interceptor.RuleBasedTransactionAttribute
以下是他人写的比较详细的文章
https://blog.csdn.net/weixin_44366439/article/details/89030080
https://blog.csdn.net/lz710117239/article/details/78787280