• Spring源码深度解析(六):Spring事务原理详解


    前言

    Spring事务实质上是利用了AOP的原理,对于AOP的原理请参考文章 Spring AOP原理及源码详解

    正文

    1、@EnableTransactionManagement工作原理

    开启Spring事务本质上就是增加一个Advisor,我们使用注解@EnableTransactionManagement注解来开启Spring事务时,该注解就是往Spring容器中添加了两个Bean:
    a) AutoProxyRegistrar
    b) ProxyTransactionManagementConfiguration
    AutoProxyRegistrar主要作用是往Spring容器中注册了1个InfrastructureAdvisorAutoProxyCreator类型的Bean,它继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理,它是一个BeanPostProcessor后置处理器,会在Bean初始化后去寻找Advisor类型的Bean,并判断当前某个Bean是否有匹配的Advisor,有则进行动态代理产生一个代理对象。

    ProxyTransactionManagementConfiguration是一个配置类,它定义了另外3个Bean:
    a) BeanFactoryTransactionAttributeSourceAdvisor:是一个Advisor
    b) AnnotationTransactionAttributeSource:相当于上面Advisor的Pointcut
    c) TransactionInterceptor:相当于上面Advisor的Advice

    AnnotationTransactionAttributeSource就是用来判断某个类或类方法上是否存在@Transactional注解。

    TransactionInterceptor就是代理逻辑,当某个类或类方法上存在@Transactional注解时,就会产生一个代理对象作为Bean,代理对象最终会执行TransactionInterceptor的invoke()方法。

    2、Spring事务执行原理

    一个Bean对象在执行Bean创建的生命周期时,会经过后置处理器InfrastructureAdvisorAutoProxyCreator的初始化后方法,会判断当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配,匹配逻辑为判断该Bean的类或类方法上是否存在@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象。

    代理对象在执行方法时,会执行该Advisor中的TransactionInterceptor的invoke()方法,执行的基本流程是:
    1、利用所配置的PlatformTransactionManager事务管理器新建一个数据库连接
    2、修改数据库连接的autocommit为false
    3、执行MethodInvocation.proceed()方法,也就是执行业务方法,其中就会执行sql
    4、如果方法没有抛异常,则提交事务
    5、如果抛了异常,则回滚事务

  • 相关阅读:
    【LeetCode】回溯题解汇总
    Qt-OpenCV学习笔记(中级)-- 总结
    技术与市场杂志技术市场杂志社技术与市场编辑部2022年第9期目录
    NanoPC-T4 RK3399:移植Kernel和rootfs
    C语言:数组指针
    13000 行代码、19 大技术,这位 16 岁高中生用 C++ 从头到尾构建了一个机器学习库
    PV-PVC存储卷-01
    一个练习 k8s 的仓库,通过动手的方式掌握k8s
    【Python】基于欧拉角的刚体转动仿真演示
    windows 安装配置GO开发环境
  • 原文地址:https://blog.csdn.net/qq_32166627/article/details/126374896