首页 > 其他分享 >多数据源事务——@DSTransactional注解原理

多数据源事务——@DSTransactional注解原理

时间:2024-01-20 13:11:25浏览次数:21  
标签:回滚 ConnectionProxy 数据源 DSTransactional 提交 注解

1.前言

在前面的文章中,提到一种手动提交多数据源事务的实现方式,dynamic-datasource包为我们提供了一种更为优雅,开箱即用的注解,即@DSTransactional,因为spring提供的@Tansactional注解是不支持多数据源的,@DSTransactional注解的出现刚好可以很好的弥补这一点。@DS注解和@DSTransactional注解是可以同时使用的,并且两者也是有着密不可分的联系,关于@DS注解请看我上一篇文章分析:动态数据源切换——@DS注解源码解析

2.@DSTransactional注解原理

1)在前文@DS注解的讨论中,不难发现DynamicDataSourceAopConfiguration类中还注册了一个advisor,就是@DSTransactional注解的切面:

image-20240116193722752

2)再看DynamicLocalTransactionInterceptor类,具体的事务开启和执行提交回滚放到了LocalTxUtil类中

image-20240120125636722

3)跟随LocalTxUtil类,将xid存入ThreadLocal类型的holder中实现开启本地事务,在拦截器的invoke方法中也会校验holder中是否为空,如果已经存在事务id,就直接执行目标方法;

image-20240120114856091

4)TransactionContext类:

image-20240120115542058

5)提交和回滚由ConnectionFactory类实现:ConnectionFactory中定义了CONNECTION_HOLDER存放数据源名称和ConnectionProxy的对应关系,而ConnectionProxy才是真正实现提交和回滚的类。

image-20240120115852431

image-20240120120300678

而putConnection方法是在执行AbstractRoutingDataSource#getConnection时被调用:

image-20240120120855491

6)ConnectionProxyConnection接口的实现类,ConnectionProxy的成员变量很简单只有数据源名称和Connection对象,要做的事情也很简单就是提交和回滚,在其实现上用notify方法代替,并没有实现Connection类的commit、rollback;默认设置提交方式为手动提交

image-20240120121311318

image-20240120124825898

3.总结

根据前文的分析,在执行AbstractRoutingDataSource#getConnection时,如果没有将数据源加入到ConnectionFactory,则会先切换数据源,再创建ConnectionProxy并将其加入ConnectionFactory:

image-20240120123432387

在开启多数据源事务时,先判断是否存在本地事务,是的话加入,即直接执行目标方法(就是传播行为的REQUIRED),随后方法执行完成后,根据是否有异常将所有加入到ConnectionFactory的连接一起提交或回滚:

image-20240120125838317

本博客内容仅供个人学习使用,禁止用于商业用途。转载需注明出处并链接至原文。

标签:回滚,ConnectionProxy,数据源,DSTransactional,提交,注解
From: https://www.cnblogs.com/zhaobo1997/p/17976348

相关文章

  • 【Mybatis-Plus】Mybatis-Plus多数据源(三)
    参考官网:多数据源|MyBatis-Plus(baomidou.com)使用方法1、引入dynamic-datasource-spring-boot-starter。1<dependency>2<groupId>com.baomidou</groupId>3<artifactId>dynamic-datasource-spring-boot-starter</artifactId>4&l......
  • SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换
    场景SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135653227上面实现通过注解和配置文件的方式去进行多数据源操作。如果业务需求,比如查询第三方接口时提供的是sqlserver的视图连......
  • dremio 基于Options注解的配置技巧
    以前简单写过一个dremio配置相关的介绍,以下是一个简单的使用原理dremio自己定义了一个Options的注解,包含此注解的类会被启动的时候进行类扫描加载,Options的会存储起来(分为不用类型的)有session级别的,系统级别的。。。。简单使用pom.xml <?xmlversion="1.......
  • MybatisPlus集成baomidou-dynamic,多数据源配置使用、MybatisPlus分页分组等操作示例
    MybatisPlus特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用......
  • SpringMVC中@pathVariable 为spring的注解,都可以用在Controller 层接受前段传递的数据
    @PathVariable主要接收http://host:port/path{参数值}数据 @pathVariable作为借口是,url是http"//ww.yoodb.com/user/getUserById/2 @RequestParam主要用于接受http://host:port/path?参数名=值数据值 @ResquesrParam请求接口时,url是http://www.yoodb.com/user/getUsrBy......
  • 9.springMvc中函数的返回值是什么 10.springmvc中@RequestMapping注解都有那些属性
    springMvc的返回值可以有很多类型,如String,modleAndView等,但事一般使用String比较友好。 在SpringMVC中,`@RequestMapping`注解用于将请求映射到控制器的处理方法。它可以应用在类级别和方法级别上,用于处理不同的URL请求。以下是`@RequestMapping`注解的一些常见用......
  • MyBatis实战指南(三):常用注解及使用方法
    在前面的两篇文章中,我们已经详细介绍了MyBatis的工作原理和基本使用。今天,我们将深入探讨MyBatis的一个重要特性——注解。如果你对MyBatis的注解还不熟悉,那么这篇文章将为你打开一扇新的大门。一、什么是注解(Annotation)首先,我们需要明白什么是注解。注解Annotation是从JDK1.5......
  • 一、@Configuration、@Conponent 、@ComponentScan 注解等
    一句话概括区别:@Configuration中所有带@Bean注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。2.可以直接调用方法,不需要@Autowired注入后使用。@Conponent 声明为Spring的组件。修饰的类不会被代理,每实例化一次就会创建一个新的对象。2.一般情况下@Bean......
  • JAVA自定义注解
     importjava.lang.annotation.*;//定义一个自定义注解public@interfaceMyAnnotation{//在注解中定义属性Stringvalue()default"";}//使用自定义注解classMyClass{//在类上应用自定义注解@MyAnnotation(value="Hello")pu......
  • 基于注解声明事务
    packagecom.atguigu.spring6.tx.config;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configur......