Seata源码分析——@GlobalTransactional

2023-11-18


前言

研读Seata源码有一段时间了,打算出一系列关于源码的文章,旨在加强自己对Seata的理解,同时也希望能帮助到读者。


脑图

本文主要分析标红的地方
在这里插入图片描述


Seata三大角色

TC :事务协调者,netty server
TM :事务管理器,netty client
RM: 资源管理器,netty client

在这里插入图片描述

  1. 只要方法上加了@GlobalTransactional,Seata通过aop检测到之后,就会使用TM和TC通信,注册全局事务。

  2. 在@GlobalTransactional涵括的代码中,不管是本服务中的sql操作,还是feign调用别的服务的sql操作,只要sql操作满足如下:insert操作,delete操作,update操作,select for update操作。 就会被seata增强,使用RM与TC通信,注册分支事务。


@GlobalTransactional

源码入口

在这里插入图片描述
GlobalTransactionScanner继承自AbstractAutoProxyCreator,在这里拦截到加了@GlobalTransactional的方法。

GlobalTransactionScanner

在这里插入图片描述
我们需要关注的方法如下:

  • AbstractAutoProxyCreator:wrapIfNecessary(aop的核心),getAdvicesAndAdvisorsForBean(拦截器)
  • InitializingBean:afterPropertiesSet(初始化TM,RM)

初始化TM,RM

spring生命周期回调接口

@Override
    public void afterPropertiesSet() {
        //是否禁止了全局事务
        if (disableGlobalTransaction) {
            if (LOGGER.isInfoEnabled()) {
                LOGGER.info("Global transaction is disabled.");
            }
            return;
        }
        //初始化netty 客户端(TM  RM)
        initClient();
    }

初始化TM,RM

  private void initClient() {  
        //init TM
        TMClient.init(applicationId, txServiceGroup);
        
        //init RM
        RMClient.init(applicationId, txServiceGroup);
    }

代码最终会调用到RpcClientBootstrap#start
在这里插入图片描述

wrapIfNecessary

在这里插入图片描述
GlobalTransactionalInterceptor#invoke
在这里插入图片描述
GlobalTransactionalInterceptor#handleGlobalTransaction---->TransactionalTemplate#execute
在这里插入图片描述
全局事务的处理是通过spring aop来增强的,下面我们来看看分支事务是如何处理的。


分支事务

代理数据源配置
在这里插入图片描述DataSourceProxy#getConnection

@Override
    public ConnectionProxy getConnection() throws SQLException {
        Connection targetConnection = targetDataSource.getConnection();
        return new ConnectionProxy(this, targetConnection);
    }

ConnectionProxy#doCommit

private void doCommit() throws SQLException {
		//处理@GlobalTransaction的分支事务
        if (context.inGlobalTransaction()) {
            processGlobalTransactionCommit();
        } 
        //处理@GlobalLock,即检查一下是否可以获取全局锁
		else if (context.isGlobalLockRequire()) {
            processLocalCommitWithGlobalLocks();
        } else {
            targetConnection.commit();
        }
    }

ConnectionProxy#processGlobalTransactionCommit

正常情况注册分支事务还会往lock_tabel插入一条记录,代表某个表的某行记录被seata用全局锁锁住了在这里插入图片描述


总结

seata作为初学还是挺难的,问题也很多,比如:

  1. 全局锁怎么实现的?
  2. 为什么需要全局锁?
  3. lock_table什么时候插入记录,什么时候删除?
  4. 读写隔离?

这些问题最好先思考在看答案,读者有更好的问题也可以提在评论区,我会更新博客回答,另外seata.io的快速入门关于AT模式的读写隔离真的绝了,把全局锁讲明白了,建议仔细阅读。

问题回答:

  1. 全局锁使用数据库表实现,lock_table。
  2. 全局锁用于读写隔离,如果有多个分布式事务同时操作同一行数据库记录,那么可以保证数据的正确性。
  3. 注册分支事务的时候会插入lock_table记录(正常情况),全局事务提交的时候会删除lock_table。
  4. 写隔离,如果要用分布式事务,那么对于同一张表更新时建议全使用@GlobalTransaction.
    读隔离,使用@GlobalTransactional+select for update 或者 @GlobalLock+@Transactional+select for update
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Seata源码分析——@GlobalTransactional 的相关文章

  • seata

    Seata 1 seata概述 1 1 Seata简介 Seata 是一款开源的分布式事务解决方案 xff0c 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 xff0c
  • seata的部署和集成

    一 部署Seata的tc server 1 下载 首先我们要下载seata server包 xff0c 地址在http seata io zh cn blog download html 当然 xff0c 课前资料也准备好了 xff1a 2
  • Windows下seata报错为can not register RM,err:can not connect to services-server的解决办法,亲测有效。

    nacoc下的服务 xff1a 点开seata的TC服务看一下里面的地址 xff0c 左下角为你该服务的ip地址 上图我的ip地址是我目前在用的校园网地址也就是你的桌面右下角的网络地址 我之前报错的原因呢是因为他这里的默认的ip是我之前虚拟
  • 【Seata】安装 - mac

    1 下载 官网 xff1a https seata io zh cn index html 2 修改配置文件 2 1 file conf 还有user password 2 2 registry conf 1 xff09 registry
  • 分布式事务:解决方案之2PC实战

    说完 分布式事务 解决方案之2PC理论 我们现在就要在理论的基础上实践一把 1 业务说明 下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程 交易过程是 张三给李四转账指定金额 2 开发环境 数据库 MySQL 5 6
  • 分布式事务6种解决方案(超详细)

    文章目录 分布式事务六种解决方案 前言 ACID 分布式事务 2PC 二阶段提交 同步阻塞协议 准备阶段 提交阶段 协调者故障分析 协调者是一个单点 存在单点故障问题 3PC 三阶段提交 准备阶段 预提交阶段 提交阶段 参与者超时机制 总结
  • Seata 多路服务调用时事务不回滚解决办法

    最近使用了Seata作为分布式事务管理工具 在一般情况如 A服务调用B服务且A服务调用C服务 即A B A C这种服务调用链路 当其中任意一个服务报错 事务是可以回滚的 然而 稍微复杂一点的情况我发现seata事务居然不会回滚了 即A B
  • 【Seata】03 - Seata AT 模式全局锁相关知识简单整理

    文章目录 前言 参考目录 版本说明 分析整理 1 全局锁的引入说明 2 全局锁相关源码整理 2 1 流程简图 2 2 事务分支注册前的 SQL 相关操作 2 3 注册分支 获取全局锁 前言 上一篇文章介绍了 AT 模式的调用流程 但是有个比
  • 3.2 ATK-ESP8266 WIFI模块-烧录固件

    ATK ESP8266 WIFI模块 烧录固件 一丶前期准备 1 在某宝买的ESP8266模块 2 烧录模式引脚 IO 0引脚接GND 另外一个不用接 左边四个 正常连接串口即可 3 烧录固件 按照原子哥给的资料 烧写方式有误 在烧录固件
  • Transactional outbox pattern

    文章目录 Transactional outbox pattern 事件驱动架构 Event Driven Architecture EDA 数据库事务和消息发布的一致性问题 Transactional outbox如何解决数据事务和消息发
  • seata1.3.0 系列学习(一、seata1.3.0 安装)

    下载seata 此处选用目前最新版本1 3 0 解压完成后 注 seata官方从1 0版本后不再提供sql脚本 以及nacos推送配置脚本 需要从0 9 0的版本复制 将红色框框的四个文件复制到1 3 0 conf目录下 执行db stor
  • seata server 1.6版本安装及配置

    文章目录 下载 安装并启动 数据库 导入数据库 修改配置文件 服务注册 配置中心 手动添加 脚本导入 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Seata 是一款开源的分布式事务解决方
  • 【Seata】00 - Seata Server 部署(Windows、Docker 基于 Jpom)

    文章目录 前言 参考目录 版本说明 Windows 部署 seata server 1 下载压缩包 2 文件存储模式 3 db 存储模式 3 1 建表 3 2 修改配置文件 3 3 启动脚本 4 源码部署 Docker 部署 seata s
  • Mysql分库分表实战(一)——一文搞懂Mysql数据库分库分表

    由于业务需要 需要对Mysql数据库进行分库分表 故而最近一直在整理分库分表的相关知识 现手上的工作也告一段落了 抽空将自己最近的学习结果转化为博文 分享给大家 本博文打算做成一个系列的 首先是分库分表的理论知识的了解 其次是基于Java编
  • 11、Seata AT+SpringCloud+MyBatisPlus+Nacos进行分布式事务操作

    具体请看 http blog shangsw com articles 2020 03 28 1585382453622 html
  • Linux 中的命令

    at是一个命令行实用程序 允许您安排在特定时间执行的命令 创建的职位at仅执行一次 在这篇文章中 我们将解释如何使用at及其配套实用程序batch atq atrm查看 删除和创建稍后执行的作业 安装中at 根据分布情况 at您的 Linu
  • 分布式事务的 N 种实现

    需求缘起 在微服务架构中 随着服务的逐步拆分 数据库私有已经成为共识 这也导致所面临的分布式事务问题成为微服务落地过程中一个非常难以逾越的障碍 但是目前尚没有一个完整通用的解决方案 其实不仅仅是在微服务架构中 随着用户访问量的逐渐上涨 数据
  • 事务,不只ACID

    1 什么是事务 应用在运行时可能会发生数据库 硬件的故障 应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题 为了提高应用的可靠性和数据的一致性 事务应运而生 从概念上讲 事务是应用程序将多个读写操作组合成一个逻
  • Seata源码分析——@GlobalTransactional

    Seata源码分析 GlobalTransactional 前言 脑图 Seata三大角色 GlobalTransactional 源码入口 GlobalTransactionScanner 初始化TM RM wrapIfNecessary
  • RT-Thread操作系统 AT组件源码分析(以 EC20 为例)

    文章目录 1 AT 组件 1 1 AT 组件调试信息级别设置 1 2 AT 命令打印使能设置 1 3 GPRS 网络注册状态检查 1 4 EC200x 是否能连接外网日志输出 1 5 AT 设备注册过程 1 6 AT 设备类注册过程 1 7

随机推荐

  • angular2 router中的路由跳转navigate

    navigate是Router类的一个方法 主要用来跳转路由 函数定义 navigate commands any extras NavigationExtras Promise
  • 人工智能(crawler)—— 爬虫综合

    目录 内容简介 第一章 爬虫简介 1 1 什么是网络爬虫 1 1 1 爬虫的简单定义 1 1 2 爬虫的分类 1 2 为什么需要爬虫 1 2 1 爬虫的用途 1 2 2怎么做爬虫 第二章 爬虫的基本常识 2 1 爬虫的合法性问题 2 2 爬
  • QT按钮显示和隐藏

    创建GroupBox 将按钮放置进去 ui groupBox gt setGeometry 100 100 150 50 int x ui groupBox gt geometry x int y ui groupBox gt geomet
  • Flutter 层叠布局组件

    文章目录 Flutter 层叠布局组件 简述 Stack 基本使用 fit属性 alignment属性 Stack Positioned IndexedStack Flutter 层叠布局组件 简述 Stack组件可以将子元素叠加显示 类似
  • 解放原画师!Wav2Lip 用 AI 听音同步人物口型

    By 超神经 内容提要 眼见为实 在 AI 技术面前已经失效了 换脸 对口型的技术层出不穷 效果越来越逼真 今天要介绍的 Wav2Lip 模型 只需一段原始视频与目标音频 就可将其合二为一 关键词 唇形同步 语音信号 近几年 好莱坞动画屡屡
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • 最小外接矩形思路以及实现

    最小外接矩形 外接矩形计算 对一个凸多边形进行外接矩形计算 需要知道当前面的最大xy 和最小xy值 即可获得外接矩形 最小外接矩形计算 对凸多边形的每一条边都绘制一个外接矩形求最小面积 下图展示了计算流程 计算流程 旋转基础算法实现 旋转点
  • Network Compression 网络压缩

    网络压缩 Network Compression 就是把一个大的网络压缩成一个小的网络 现如今 手机设备 手表等都比较流行 但我们平常训练的网络都比较大 在一些 小 的设备或许很难存储和运行 所以这就需要把网络进行压缩 常用的方法 Netw
  • Shell脚本编写教程

    Shell脚本编写教程
  • 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?

    为什么栈的数组长度必须是一个常量 而堆的数组长度可以是变量 栈区数组长度使用变量会报错 其原因就在于栈是编译器管理的 在程序运行前就已经分配好了空间的大小 而使用变量 编译器无法知道该分配多大的内存空间 于是报错 但堆上的内存是动态创建的
  • Scala简介

    目录 一 Scala简介 1 1 概念 1 2 特点 1 3 Scala的优点 二 Scala基本数据类型和运算符 一 数据类型 1 1 类型支持 1 2 定义变量 1 3 类型推断 1 4 Scala解释器 二 字面量 2 1 整数字面量
  • linux系统安装五笔输入法,Linux下安装五笔输入法

    想体验一下Ubuntu10 10 由于我在Windows下用惯了五笔输入法 装上Ubuntu后一直为装不上理想的五笔输入法而烦恼 幸得高人帮忙 才解决了这一难题 心里那个是痛快啊 开始在网上搜索 查得的结果不尽如人意 一会缺少这个 一会又得
  • R-CNN史上最全讲解

    文章目录 一 初识R CNN 网络结构 二 训练步骤 1 RP的确定 2 模型pre training 3 Fine Tunning 4 提取并保存RP的特征向量 5 SVM的训练 6 bbox regression的训练 三 测试步骤 s
  • MySQL8--Windows下使用msi(图形界面)安装的方法

    原文网址 MySQL8 Windows下使用msi 图形界面 安装的方法 的博客 CSDN博客 简介 本文介绍Windows使用图形界面安装MySQL8的方法 下载地址 1 网址入口 进入MySQL的官方网站 https dev mysql
  • 后端开发缓存篇之缓存及缓存模式的介绍

    一 什么是缓存 缓存 简单说就是为了节约对原始资源重复获取的开销 而将结果数据副本存放起来以供获取的方式 二 什么时候使用缓存 1 以 幂等和安全的方式对资源的获取操作 2 缓存数据必须是重复获取的 缓存能生效的本质是空间换时间 缓存的命中
  • Centos 7 升级Openssh7.4到9.2

    本次使用在线升级 因此要求系统yum wget等功能能正常使用 环境 cat etc redhat release CentOS Linux release 7 6 1810 Core ssh V OpenSSH 7 4p1 OpenSSL
  • wired xdisplay只能复制无法拓展

    我出现的问题是ipad可以复制屏幕 但是在系统显示设置中却没有显示有第二块屏幕 如果显示有第二块屏幕 直接win p调成拓展就可以解决了 如果出现的问题和我一样 可以按下面步骤解决 1 ipad和桌面端连接 2 PC端xDisplay 高级
  • 微软和Facebook推出Docs.com

    来源 德胜网 4月22日 据国外媒体报道 Facebook和微软在联手一项在线文件共享服务 看起来多一点像Google Docs 周三在Facebook的F8会议Docs com上线 该网站允许Facebook用户使用Facebook连接登
  • 2.虚拟机CentOS7.6安装SOA

    1 安装JDK8 1 1检查是否自带OpenJDK rpm qa grep jdk 卸载openjdk sudo yum y remove java openjdk 验证是否卸载了openjdk 1 2上传安装包 解压安装包 tar zxv
  • Seata源码分析——@GlobalTransactional

    Seata源码分析 GlobalTransactional 前言 脑图 Seata三大角色 GlobalTransactional 源码入口 GlobalTransactionScanner 初始化TM RM wrapIfNecessary