• spring事务实现原理


    实现原理

    本质

    如果你用过Spring AOP,那么理解注解事务就十分简单了。事务注解本质上实在事务方法加入一个Around切面,在方法开始前开始事务,在抛出异常后回滚事务。使用简单伪代码可以简单理解为

    doWithTransaction(...){
        try{
            startTransaction();//开启事务
            originMehod();//原始方法调用
            commit();//事务提交
        }catch(exception ex){
            rollback()//事务回滚
        }
    }

    事务传播性

    Spring transaction有各种事务传播性,归根到底就是当前是新开事务还是使用已有事务(或者是抛异常)。其实很简单,使用一个ThreadLocal来记录下当前事务状态(是否在事务中),改造一下上面的方法

    doWithTransaction(...){
        Transaction transaction= getFromThreadLocal();
        Transaction curTransaction;
        if(如果不存在事务){
            curTransaction = newTransaction()
            curTransaction.startTransaction();//开启事务
            try{
                originMehod();//原始方法调用
            }catch(exception ex){
                curTransaction.rollback()//事务回滚
                throw ex
            }
            curTransaction.commit();//事务提交
        }else{
            if(不支持当前事务){
                oldTransaction = transaction 
                oldTransaction.suspend()//当前事务挂起
                curTransaction = newTransaction();
                curTransaction.startTransaction();//开启事务
                try{
                    originMehod();//原始方法调用
                } catch(exception ex){
                    curTransaction.rollback()//事务回滚
                    throw ex
                }
                curTransaction.commit();//事务提交
                oldTransaction.resume()
            }else{
                //复用已有事务
                originMehod();//原始方法调用
            }
        }
    }

    指定事务回滚异常

    其实就再catch住异常以后,判断下当前异常是否需要回滚。

    try{
        originMehod();//原始方法调用
    } catch(exception ex){
        if(事务满足回滚){
            curTransaction.rollback()//事务回滚
        }
        throw ex
    }

    上面伪代码虽然简单,但spring注解事务的基本原理基本就是这样

    源码阅读相关类

    事务管理类

    PlatformTransactionManager(及其抽象AbstractPlatformTransactionManager),其实是TransactionInterceptor中的一个重要属性,主要功能是,创建一个事务,提交事务,回滚事务等操作。我们再配置spring的时候都会创建,例如常见的DataSourceTransactionManager,。

    AOP切面类

    TransactionInterceptor(及其父类TransactionAspectSupport)保存类当前线程的事务状态,TransactionInterceptor是在调用事务方法中实际进入的入口:

    1. 根据当前注解内容,选择事务管理器(PlatformTransactionManager)
    2. 会根据当前线程事务状态,是创建新事务还是使用已有事务。
  • 相关阅读:
    一分钟认识:Cucumber框架(一)
    迭代=冲刺?
    Nresource服务之接口缓存化
    58集团支付网关设计
    服务治理在资源中心的实践
    资源中心——连接池调优
    4种常用的演讲结构: 黄金圈法则结构、PREP结构、时间轴结构、金字塔结构
    微服务时代,领域驱动设计在携程国际火车票的实践
    Sentinel -- FLOW SLOT核心原理篇
    管理篇-如何跨部门沟通?
  • 原文地址:https://www.cnblogs.com/lizo/p/8384178.html
Copyright © 2020-2023  润新知