首页 > 其他分享 >Spring 事物管理与原理

Spring 事物管理与原理

时间:2024-10-18 15:45:36浏览次数:1  
标签:tm 事务 Spring 事物 txAttr 原理 执行 方法

定义与描述

Spring 有事物传播属性,用于保证数据的统一提交与统一回滚
数据库 有事物特性(ACID)与数据隔离级别,用于处理脏读、幻读、不可重复读

Spring 事物管理,是指系统在多线程情况下,配合数据库事物完成数据的统一提交与统一回滚。网上很多关于事物的描述,都是基于数据库实现的。例如,银行转账、收费站收费等。
本片文章只讲事物管理

事务传播行为类型 使用说明
REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,继续当前事物。
SUPPORTS 支持事务。但如果当前没有事务,就以非事务方式执行。事物可有可无
MANDATORY 使用事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。然后创建一个与外事务没有关联的新事务。新事物有自己的隔离级别、锁。不依赖于外事务,可单独提交与回滚。新事物执行完后,外事务在进行提交操作。
NOT_SUPPORTED 不支持事物。如果当前存在事务,就把当前事务挂,执行内部方法。内部方法执行完,在执行外部事务。如果外部方法没有事务,可直接执行,不会挂起。
NEVER 不使用事物。如果当前存在事务,则抛出异常。
NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。内事务与外事务的关系:內事务必须在外事务提交之后在提交内事务的报错,会直回到保存点(savepoint,任务执行前的点),不会影响外事务的提交外事的报错会影响內事务的提交

REQUIRED、REQUIRES_NEW、NESTED ,这三个是日常系统中最常用的三种。

Spring 事物原理

   Spring事务是通过AOP实现的,首先是获取代理对象,然后通过AOP的整体流程执行后面的操作逻辑。一般是通过通知的方式实现功能增强,但事务是通过TransactionInterceptor来实现的,通过调用invoke完成事务逻辑。主要是调用其父类(TransactionAdviceSupportd)的invokeWithInTransaction方法,以下逻辑也是此方法里的逻辑。

@EnableTransactionManagement 注解开启事物管理。

逻辑步骤:

  1. 准备工作,解析各个方法的注解与属性,判断是否需要重新开启新事务
  2. 如果开始事务,需要后去数据库链接,并关闭自动提交功能
  3. 执行sql
  4. 如果失败,执行completeTransactionAfterThrowing方法,调用里面的doRollBack方法
  5. 如果成功,执行commitTransactionAfterReturn方法,调用里面的doCommit方法
  6. 最后的最后,执行cleanTransactionInfo方法,清空事务信息

invokeWithInTransaction 代码逻辑(简化)

    // 事务逻辑调用方法
    protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, TransactionAspectSupport.InvocationCallback invocation) throws Throwable {
        // 获取事务属性
        TransactionAttributeSource tas = this.getTransactionAttributeSource();
        TransactionAttribute txAttr = tas != null ? tas.getTransactionAttribute(method, targetClass) : null;
        // 获取 beanFactory中的 事务管理对象
        PlatformTransactionManager tm = this.determineTransactionManager(txAttr);
        String joinpointIdentification = this.methodIdentification(method, targetClass, txAttr);
        // 声明一个事务
        Object result;
        // 判断 tm 是走自定义任务管理器,还是默认管理器
        if (txAttr != null && tm instanceof CallbackPreferringPlatformTransactionManager) {
            // 自定义事务
            TransactionAspectSupport.ThrowableHolder throwableHolder = new TransactionAspectSupport.ThrowableHolder();

            result = ((CallbackPreferringPlatformTransactionManager)tm).execute(txAttr, (status) -> {
                //创建事务,事务属性等信息保存到TransactionInfo中
                TransactionAspectSupport.TransactionInfo txInfo = this.prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);

                try {
                    // 执行目标方法
                    Object var8 = invocation.proceedWithInvocation();
                    return var8;
                } catch (Throwable var13) {

                } finally {
                    this.cleanupTransactionInfo(txInfo);
                }
            });
            return result;
        } else {
            // 系统默认管理器
            //创建事务,事务属性等信息保存到TransactionInfo中
            TransactionAspectSupport.TransactionInfo txInfo = this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
            result = null;

            try {
                // 执行目标方法
                result = invocation.proceedWithInvocation();
            } catch (Throwable var17) {
                // 异常执行 doRollBack 方法
                this.completeTransactionAfterThrowing(txInfo, var17);
                throw var17;
            } finally {
                // 最后的最后执行 clean ,清空事务信息
                this.cleanupTransactionInfo(txInfo);
            }
            // 成功执行  doCommit 方法
            this.commitTransactionAfterReturning(txInfo);
            return result;
        }
    }

标签:tm,事务,Spring,事物,txAttr,原理,执行,方法
From: https://www.cnblogs.com/zz-1q/p/16119003.html

相关文章