Spring事务

目的:记录@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

原文地址:https://www.cnblogs.com/kayj/p/12092297.html