分布式事务学习笔记(四)微服务实现Stata AT模式、Stata Saga模式介绍

文章目录

  • 前言
  • 4 Seata AT 模式
    • 4.1 实现原理
    • 4.2 脏写问题
    • 4.3 微服务实现AT模式
      • 4.3.1 新建数据库表
      • 4.3.2 修改配置文件
      • 4.3.3 重启服务并测试
  • 5 Seata Saga 模式

前言

分布式事务学习笔记(一)分布式事务问题、CAP定理、BASE理论、Seata
分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
分布式事务学习笔记(三)微服务实现Seata XA模式

4 Seata AT 模式

AT 模式同样是分阶段提交的非侵入式分布式事务模型,不过弥补了 XA 模式中资源锁定周期过长的缺陷。

4.1 实现原理

  • 第一阶段RM的工作
    • 向TC注册分支事务
    • 执行业务SQL并直接提交
    • 记录更新前后快照(undo-log)
    • 向TC报告分支事务状态
  • 第二阶段RM的工作
    • 如果收到TC确认提交的指令,则删除快照(undo-log)
    • 如果收到TC确认回滚的指令,则根据快照(undo-log)恢复数据到更新前

其中,记录更新前后快照(undo-log) 是RM拦截业务SQL,根据业务SQL的where条件查询原始数据,并保存起来形成快照。后续需要回滚时,可以根据这个快照直接恢复。

  • 与 XA 模式的比较
XA模式AT模式
事务特性第一阶段不提交事务,锁定资源第一阶段提交事务,不锁定资源
回滚机制依赖数据库机制实现回滚利用数据快照实现数据回滚
一致性强一致最终一致

4.2 脏写问题

在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题,如图:

问题出现的关键原因在于,当前事务根据快照回滚之前,有另外一个事务也操作了当前数据,使得当前事务的快照不再正确。

解决脏写问题的思路就是引入了全局锁的概念。

事务在释放DB锁之前,先拿到全局锁,只有拿到全局锁的事务有资格操作当前数据,从而避免同一时刻有另外一个事务来操作当前数据,如图:

由上图可知,事务1持有全局锁,具备执行权。而事务2拿不到全局锁,则无法操作当前数据。事务1进行回滚时则不会有影响。

AT模式的优点在于:

  • 第一阶段完成后直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点在于:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

4.3 微服务实现AT模式

4.3.1 新建数据库表

AT模式中的快照生成、回滚等动作都是由框架自动完成,没有任何代码侵入,实现简单。但AT模式需要 lock_table 表来记录全局锁、undo_log 表来记录数据快照。

在学习 XA 模式时,就已经创建了 lock_table 表,而创建 undo_log 表的SQL可以在 https://gitee.com/seata-io/seata/blob/v1.5.1/script/client/at/db/mysql.sql 中找到:

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(`branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',`xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',`log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',`log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',`log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

4.3.2 修改配置文件

修改微服务的application.yml文件,将事务模式修改为AT模式即可:

seata:data-source-proxy-mode: AT # 默认就是AT

4.3.3 重启服务并测试

假设现在商品库存为10,用户余额为1000。用户使用300金额购买了6件商品:

程序执行到这里,已经扣除用户余额成功。而在 undo_log 表中记录了金额的快照:

程序继续执行,下单成功,undo_log 表的记录被删除:

假设此时用户再次使用300金额购买了6件商品,由于此时库存只剩下4件,所以会下单失败:

jd-account-service服务的日志显示,余额先是扣除成功,而后被回滚:

最终余额和库存均没有改变:

可见AT模式的分布式事务已生效。

5 Seata Saga 模式

Saga 模式是 Seata 提供的长事务解决方案。其工作流程如下:

在该模式中,分布式事务内有多个参与者,每一个参与者都有一个正向服务和一个补偿服务,需要用户根据业务场景分别实现其正向操作和逆向回滚操作。

分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务会去执行前面各参与者的补偿服务,回滚已提交的操作,使分布式事务回到初始状态。

因此,Saga 模式也分为两个阶段:

  • 一阶段:各参与者直接提交本地事务
  • 二阶段:均成功则什么都不做;有任意失败则通过补偿服务来回滚

Saga 模式的优点

  • 事务参与者可以基于事件驱动实现异步调用,吞吐高
  • 一阶段直接提交事务,无锁,性能好

缺点

  • 软状态持续时间不确定,时效性差
  • 没有锁,没有事务隔离,会有脏写

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537852.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

小间距LED显示屏的技术原理分析

在现代显示技术领域,小间距LED显示屏以其卓越的显示效果和灵活的应用场景,逐渐成为市场的新宠。本文将深入探讨小间距LED显示屏的技术原理,分析其在显示领域的应用优势。 A、小间距LED显示屏的基本概念 小间距LED显示屏是指LED灯珠之间的间距…

大模型微调基本概念指北,零基础入门到精通,收藏这一篇就够了

本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。 本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型…

03-Mac系统PyCharm主题设置

目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavi…

软考高级:嵌入式系统:片级初始化、板级初始化、系统级初始化 AI 解读

生活化例子 想象一下你要启动一辆车,这个过程就可以类比成嵌入式系统的初始化过程。 片级初始化:相当于启动汽车引擎,确保发动机、变速箱这些核心部件能够正常工作。板级初始化:就像检查车子的电子系统、灯光、车窗是否正常&am…

整流电路的有源逆变工作状态

目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器,使其将直流电源的能量反向送回…

如何写出军工级的代码?

编写军工级代码意味着要达到极高的可靠性、安全性、可维护性和效率,这通常涉及到严格的标准和流程。以下是一些关键点,帮助你编写军工级的代码: 1. 遵循严格的开发流程 军工项目通常需要遵循特定的软件开发标准,例如:…

农产品自主供销小程序--论文源码调试讲解

第二章 开发技术介绍 此次管理系统的关键技术和架构由B/S结构、java和mysql数据库,是本系统的关键开发技术,对系统的整体、数据库、功能模块、系统页面以及系统程序等设计进行了详细的研究与规划。 2.1 系统开发平台 在该在线农产品自主供销小程序中&a…

WebMagic:强大的Java网络爬虫框架

上班苦上班累,上班就想打瞌睡。 在当今信息爆炸的时代,数据的获取和处理变得越来越重要。网络爬虫作为获取网络数据的重要工具,已经成为许多开发者和数据科学家的必备技能。今天,我们将介绍一个广受欢迎的Java网络爬虫框架——We…

为什么Python有了列表list、元组tuple、字典dict这样的容器后,还要弄个集合set?

因为set是数学意义上的集合,拥有唯一和无序的特性,即用来存放没有顺序且无重复的数据,并且元素是不可变的。 这和list、tuple完全不同,这两个能存放相同的元素,且支持索引,有顺序。 set可以很方便的进行并…

激光模组多少钱一套?具体费用的决定因素

激光模组作为现代科技领域的重要组件,然而,对于许多潜在买家而言,激光模组的价格往往是一个令人困惑的问题。本文将跟大家一起探讨激光模组的价格范围及其具体费用的决定因素。 激光模组的价格范围 激光模组的价格因多种因素而异,…

【2025深圳春季全球高端食品展览会展位开始预订】

2025深圳春季全球高端食品展览会 时间:2025年2月23-25日 地点:深圳国际会展中心(宝安) 随着全球食品行业的蓬勃发展,中国作为世界第二大经济体,其食品市场规模持续扩大,展现出巨大的发展潜力…

.NET 一款免杀的白名单工具可执行系统命令

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

优化内容个性化:无限住宅代理如何做到的

数字化时代,个性化内容是提升用户体验和增加用户粘性的关键因素。企业通过个性化内容来满足用户的独特需求和兴趣,从而提高用户满意度和转化率。然而,个性化内容的实现需要准确的用户数据和行为分析,这就要求企业能够有效地收集和…

陶哲轩对OpenAI o1模型使用体验的观察

🦉 AI新闻 🚀 陶哲轩对OpenAI o1模型使用体验的观察 摘要:陶哲轩在8月份使用OpenAI最新模型o1,发现其在解决数学问题方面有所进步,能成功识别克莱姆定理,但仍存在错误。虽然o1比之前的模型表现更好&#…

腾讯百度阿里华为常见算法面试题TOP100(5):子串、堆

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 子串 560.和为K的子数组 class Solution { public:int subarraySum(vector<int>& nums, int k) {// 寻找在区间[i, j]的和为k的值// 用…

自托管的网站应用防攻击防火墙SafeLine

背景介绍 在当今数字化时代&#xff0c;网络安全面临着前所未有的挑战。随着网络攻击技术的不断进步&#xff0c;从 SQL 注入、XSS 攻击到更为复杂的 RCE 和 SSRF 攻击&#xff0c;网站和 web 应用程序的安全防护变得越来越困难。这些攻击不仅威胁到个人和企业的敏感数据&…

基于51单片机的锅炉控制系统PID调节proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1zsACHTP2EpYVyqC-ht0HMg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

Python元组详解

​ 在上一篇笔记中介绍了列表。 公众号端&#xff1a; 列表https://mp.weixin.qq.com/s?__bizMzkwMjc0MTE3Mw&mid2247483924&idx1&snf8b36af8953e8fa9c26ebbf6081edd48&chksmc0a1afcef7d626d8bd7feedae04c8717d90f9a94266a4e6c10068d6cfaebc73ca988b39147cf#…

MySQL用户管理(DCL)

先看一下我原本的mysql当中的user里面的数据库 基本语法 1.查询用户 use mysql; select * from user; 2.创建用户 create user 用户名主机名 identified by 密码;例1&#xff1a;创建用户 itcast&#xff0c; 只能够在当前主机localhost访问&#xff0c; 密码123456; cr…

鸿蒙开发之ArkUI 界面篇 七 综合案例

一个登录界面&#xff0c;如图&#xff1a; 首先分析&#xff0c;垂直方向出现了5排&#xff0c;分别是顶部的图片组件&#xff0c;两个输入框&#xff0c;一个登录按钮&#xff0c;一排“前往注册“和”忘记密码“组件&#xff0c;他们水平对齐&#xff0c;用row容器&#xff…