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

  • 相关阅读:
    字符串排序算法总结
    子字符串匹配常用算法总结
    springboot拦截器
    springboot 双 sqlite 数据源配置
    myeclipse springboot 配置帆软报表
    保存在session中的登陆信息无故丢失的解决办法
    删除多条商品
    前台验证邮箱不能重复
    mybatis两张表关联关系映射
    蚂蚁金服支付平台代码配置
  • 原文地址:https://www.cnblogs.com/kayj/p/12092297.html
Copyright © 2011-2022 走看看