zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Hoder.js介绍
    vim折叠方法
    tensorflow最基础分类实例--iris分类
    语音识别GMM-HMM
    亨元模式
    责任链模式
    命令模式
    策略模式
    工厂模式
    Java高并发程序设计(十)--无锁
  • 原文地址:https://www.cnblogs.com/kayj/p/12092297.html
Copyright © 2011-2022 走看看