浅谈分布式事物解决方案

news2024/11/17 15:32:04

 目录

背景

1 XA规范分布式事物方案

 1.1 俩阶段提交(2PC)

  1.2 三阶段提交(3PC)

2 补偿事务(TCC)

3 可靠消息最终一致性方案

4 可靠消息最终一致性方案

5 SAGA事物

6 Seata AT 模式


背景

        分布式事务出现的原因:
           1 在微服务环境下,服务与服务之间一般是采用RPC远程调用的,每个服务都有自己独立的数据库,既自己的本地事务。
        2 在一个项目中如果采用多个数据源,也会出现分布式事务的现象。        

由于数据库分库分表和应用SOA化(微服务)的出现,为了保证不同数据库的数据一致性,分布式事物的概念也就诞生了,主要有以下几种:

1 XA规范分布式事物方案

  • 场景:不适用于并发量大的业务场景,适用于单系统多数据源 
  • 开源的框架:spring-boot-starter-jta-atomikos,seata框架

 1.1 俩阶段提交(2PC)

  • 基本流程

        

  • 缺点
不足原因
数据不一致的问题1 TM通知RM(A),RM(B)提交
2 RM(A)成功提交,RM(B)由于网络抖动
3 没有接收到请求,导致无法提交,且占用了资源
单点故障风险RM出现故障,参与者就无法commit。资源会阻塞。
性能问题参与者在事务提交阶段处于同步阻塞状态,占用系统资源

  1.2 三阶段提交(3PC)

  • 基本流程

 

  • 相对于2PC的改进:参与者在一定时间内未收到协调者的commit请求,会自动提交事务,不会一致阻塞等待
  • 不足:还是会出现数据不一致(见2PC的数据不一致的不足)

2 补偿事务(TCC)

  • 场景:对金额要求性很高的业务场景,银行核心主机的账务系统,不容半点差池。
  • 开源的框架:tcc-transaction框架,himly框架,ByteTCC框架,seata框架
  • 基本流程

        

  •  其实就是针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作
名词含义用法场景例子(订单的支付)
Try

这个阶段对各个服务的资源检测以及对资源进行锁定或者预留【锁定资源】

先置一个中间状态“UPDATING”,而不是直接设置“支付成功”状态
Confirm

执行真正的业务操作,不作任何业务检查,只使用Try阶段预留的业务资源【要求具备幂等设计】

将订单的中间状态变更为PAYED-支付成功
Cancel

如果任何一个服务的业务方法执行出错,
那么这里就需要进行补偿,即执行回滚操作,
释放Try阶段预留的业务资源 【要求具备幂等设计】
 

将订单的状态设置为“CANCELED”

    PS:分布式事务TCC模式的空回滚和业务悬挂问题 - 腾讯云开发者社区-腾讯云

3 可靠消息最终一致性方案

  • 场景:对数据非强一致性要求,可接受短暂的延迟,如申请退款后,可接受“你的余额将再2小时内返回”。
  • 实现:基于本地消息表服务(自研),基于支持分布式事务的消息中间件(RocketMQ)
  • 基本流程

    

  • 基于本地消息表服务的脑图

4 可靠消息最终一致性方案

  • 场景:适用于一些最终一致性时间敏感度低的业务。
  • 实现:需要结合自身的业务去实现【其实就是重试的JOB】

SAGA事物

  • 场景:订单履约成功后,通知仓储系统配货,配货成功后,需要通知物流系统。类似于工作流的方式。
  • 事物思想:将一个长的分布式事务,拆分为一连串的每个服务的本地事务,然后每个服务对每个接口提供两个接口。一个是业务接口,一个是回滚的补偿接口,正常情况下就是依次的进行调用。
  • 实现:seta框架
  • 基本流程

        

  •  处理事务一致性方式
    • 向前恢复策略:不断重试的方式保证事务完成
    • 向后恢复策略:后者通过子事务的补偿事务,逐一回滚的方式让事务标记失败

 6 Seata AT 模式

  • 概念:AT模式是一种无侵入的分布式事务解决方案,在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
  • 机制:一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

                 二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

  • 整体的概要流程图:

具体的流程可参照 seata的AT模式_最爱奶油花生的博客-CSDN博客_seata的at模式

作者:老喵

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

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

相关文章

使用Git-lfs上传超过100m的大文件到GitHub

文章目录 1. 安装 git-lfs2. 在Git中安装git-ifs3. 找到工程中的所有大文件4.执行完这行命令,项目目录下会生成文件 .gitattributes,此时Git push将 .gitattributes 提交到远程仓库。 5. 需要注意的事 1. 安装 git-lfs Git Large File Storage | Git La…

Day44【动态规划】完全背包、518.零钱兑换 II、377.组合总和 Ⅳ

完全背包 文章讲解 视频讲解 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将物品装入背包里的最大价值 完全背包和01背包问题…

F103ZET6使用FSMC和HAL点亮ILI9341

前言 将标准库下的ILI9341驱动移植到使用CubeMX生成的HAL库环境,并成功运行。 一、STM32CubeMX生成框架 (一)配置RCC、SYS和时钟树 参见常规配置。 (二)配置FSMC 1、原理图引脚定义 LCD8080接口使用的引脚主要分…

【数据结构】线性表 ⑤ ( 双循环链表 | 双循环链表特点 | 双循环链表插入操作处理 | 代码示例 - 使用 Java 实现 双循环链表 )

文章目录 一、双循环链表二、双循环链表特点三、双循环链表插入操作处理四、代码示例 - 使用 Java 实现 双循环链表 一、双循环链表 " 双循环链表 " 是 在 单循环链表 的基础上 , 在每个 节点 中 , 新增一个 指针 , 指向 该节点 的 前驱节点 ; 双向循环链表 每个 节…

头歌计算机组成原理实验—运算器设计(8)第8关:乘法流水线设计

第8关:乘法流水线设计 实验目的 学生掌握运算流水线基本概念,理解将复杂运算步骤细分成子过程的思想,能够实现简单的乘法运算流水线。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件,在6位补码阵列乘法器中利用5位阵列乘…

React学习笔记三-模块与组件的理解

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第三篇,主要介绍react中的模块与组件。 目录 1.模块与组件 1.1模块 1.2组件 1.3模块化 1.4组件化 2.React面向组件编程 2.1函数式组件 2.2类组件 2.2.1类知识的复…

防火墙(一)

防火墙知识 一、iptables概述二、四表五链四表五链iptables防火墙的使用方法 三、示例操作四、规则的匹配通用匹配:隐含匹配:端口匹配: --sport源端口、--dport目的端口TCP标志位匹配:ICMP类型匹配:显示匹配&#xff1…

Windows 安装MySQL 8.0 超详细教程(mysql 8.0.30)

目录 一、删除以前安装的MySQL服务 1、查找以前是否装有mysql 2、删除mysql (1)停止mysql服务: (2)删除mysql服务: 3.检查mysql是否已删除 二、下载mysql二进制包 三、解压二进制包,编辑…

一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理笔记(大全) 🧊…

第一个 Rust 程序

目录 必要知识代码示例 Cargo 教程[Rust 输出到命令行](https://www.runoob.com/rust/rust-println.html)资料 必要知识 Rust 语言代码文件后缀名为 .rs 使用 rustc 命令编译 .rs 文件 rustc runoob.rs # 编译 runoob.rs 文件编译后会生成 可执行文件 例如: …

『python爬虫』26. selenium与超级鹰处理复杂验证码的处理(保姆级图文)

目录 1. 图片选择类验证码2. 滑块验证码3. 滑块出错,不加载总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 图片选择类验证码 我们这里查看超级鹰文档 图片验证码返回的是一个 dic 结构为 x1,y1…

【SAM系列】An Alternative to WSSS? An Empirical Study of SAM on WSSS Problems

论文链接:https://arxiv.org/pdf/2305.01586.pdf 论文代码:暂无 目的 WSSS旨在弱标签的情况下,生成高质量的分割伪标签,然后用于全监督的语义分割训练。本文探索用SAM来生成伪标签来替代WSSS方案。 为什么不直接用SAM分割而利用…

《面试1v1》synchronized

源码都背下来了,你给我看这 我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你好,我看到你的简历上写着你熟悉 Java 中的 “synchronized” 关键字。你能给我讲讲它的作…

chatgpt赋能Python-python3反转字符串

Python3反转字符串技巧:让你的代码更高效! 你是否曾经在编程时需要对字符串进行反转,但却不知从何入手?Python3提供了简单易用的方法,帮助你更快地反转字符串。本文将介绍Python3中字符串反转的方法以及如何在代码中利…

chatgpt赋能Python-python3如何安装numpy

如何安装numpy? 介绍 在Python编程中,NumPy是使用最广泛的库之一。NumPy是数学和科学计算中的核心模块,主要用于处理数字数据,包括数组计算、线性代数、傅里叶变换、随机数生成等任务。在Python编程中,使用NumPy可以…

chatgpt赋能Python-python3小游戏

Python3小游戏:为你的休闲时光增添乐趣 如果你正处于寻找一款简单好玩的小游戏,那么Python3小游戏将是你的不二之选。作为一名有10年Python编程经验的工程师,我可以说Python3小游戏是一款非常有趣、挑战性适中、易于上手的游戏。接下来&…

工作流 jbpm(图文并茂)

文章目录 1 工作流概述2 jBPM概述3 jBPM开发环境搭建及其配置3.1 准备工作3.2 搭建jBPM开发环境3.3 加入jar包 4 系统数据库表介绍4.1 建表4.2 数据库逻辑关系4.2.1 资源库与运行时的表4.2.2 历史数据表 4.3 表结构4.4 流程操作与数表交互说明 5 相关概念6 流程图说明6.0 快速上…

【学习笔记】Rider调试unity【 联调、断点调试等】(决定弃用vscode了)

目录 一 弃用vscode原委二 Rider调试Unity2.1 启动调试2.2 pausepoint 暂停点2.2.1 使用pausepoint2.2.2 pausepoint与breakpoint的区别 2.3 不同run configuration区别 三 Rider编辑3.1 补充 四 总结 转载请注明出处:🔗https://blog.csdn.n…

头歌计算机组成原理实验—运算器设计(4)第4关:16位快速加法器设计

第4关:16位快速加法器设计 实验目的 帮助学生理解成组进位产生函数,成组进位传递函数的概念,熟悉 Logisim 平台子电路的概念,能利用前述实验封装好的4位先行进位子电路以及4位快速加法器子电路构建16位、32位、64位快速加法器&a…

Android 12.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)

1.前言 在12.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的通知栏的背景是白色四角的背景,由于在产品设计中,需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景,然后通过systemui的通知流程,设置默认下拉状态栏UI中的通知…