首页 > 其他分享 >本地/全局/分布式事务

本地/全局/分布式事务

时间:2024-05-26 17:23:20浏览次数:16  
标签:事务 本地 SAGA 数据源 提交 全局 参与者 分布式

根据服务架构,事务可以大致划分为三类

  • 本地事务:一个服务使用一个数据源
  • 全局事务:一个服务使用多个数据源
  • 分布式事务:涉及多个服务,不同服务使用不同数据源

本地事务

由数据库提供支持,如MySQL中的InnoDB存储引擎,提供了ACID实现。

全局事务

涉及到多个数据源,需要从外部提供支持。XA(eXtended Architecture)事务处理架构就是为此而生的,其核心内容是定义一个全局的事务管理器(用于协调全局事务)和局部的资源管理器(用于驱动本地事务)之间的通信接口。XA 接口是双向的,能在一个事务管理器和多个资源管理器之间形成通信桥梁,通过协调多个数据源的一致动作,实现全局事务的统一提交或者统一回滚。

XA

XA 将事务提交拆分成为两阶段过程:

  • 准备阶段:又叫投票阶段,协调者询问事务的所有参与者是否准备好提交,参与者如果已经准备好提交则回复 Prepared,否则回复 Non-Prepared。对于数据库来说,准备操作是在重做日志中记录全部事务提交操作所要做的内容,它与本地事务中真正提交的区别只是暂不写入最后一条 Commit Record 而已。
  • 提交阶段:又叫作执行阶段,协调者如果在上一阶段收到所有事务参与者回复的 Prepared 消息,则先自己在本地持久化事务状态为 Commit,在此操作完成后向所有参与者发送 Commit 指令,所有参与者立即执行提交操作;如果任意一个参与者回复了 Non-Prepared 消息,或任意一个参与者超时未回复,协调者将自己的事务状态持久化为 Abort 之后,向所有参与者发送 Abort 指令,参与者立即执行回滚操作。对于数据库来说,commit操作是很轻量的,仅仅是持久化一条 Commit Record 而已,只有收到 Abort 指令时,需要根据回滚日志清理已提交的数据,这可能是相对重负载的操作。

这个过程也被称为两阶段提交(2 Phase Commit,2PC),这种方式其实存在一些问题

  • 单点问题:协调者宕机后,无法工作
  • 性能问题:所有参与者被当作一个整体,需要等到所有操作结束才算完成,这种方式,可想而知,性能较差。
  • 一致性风险:在协调者进行commit操作后宕机,无法向参与者发出commit指令。这会导致事务数据不一致,协调者已提交,参与者未提交。

因为这些问题的存在,不如将全局事务转换为分布式事务进行处理。

分布式事务

由于涉及多个服务,多个数据源,无法由单个节点提供事务支持,必须由外部提供支持。这其实就是分布式系统中的一致性,事务必须要保证一致性,但是有强一致性和弱一致性-最终一致性的区别。

可靠事件队列

基本思想是通过最终一致性的方式来实现分布式事务。具体方案是,多个服务之间通过消息队列连接,以消息消费的形式进行接口调用。在发生异常时,重复消费直至成功,或者在失败几次后,记录下来进行手动确认。

在这个方案中,需要保证接口的幂等性,因为网络原因可能重复消费消息,消息系统需要保证消息的不丢失。

SAGA事务

SAGA提出了一种提升“长时间事务”(Long Lived Transaction)运作效率的方法,思路是把一个大事务分解为可以交错运行的一系列子事务集合。

原本 SAGA 的目的是避免大事务长时间锁定数据库的资源,后来发展成将一个分布式环境中的大事务分解为一系列本地事务的设计模式。SAGA 由两部分操作组成。

  • 大事务拆分若干个小事务,将整个分布式事务 T 分解为 n 个子事务,命名为 T(1),T(2),…,T(i),…,T(n)。每个子事务都应该是或者能被视为是原子行为。如果分布式事务能够正常提交,其对数据的影响(最终一致性)应与连续按顺序成功提交 T(i)等价。
  • 为每一个子事务设计对应的补偿动作,命名为 C(1),C(2),…,C(i),…,C(n)。T(i)与 C(i)必须满足以下条件:
    • T(i)与 C(i)都具备幂等性。
    • T(i)与 C(i)满足交换律(Commutative),即先执行 T(i)还是先执行 C(i),其效果都是一样的。
    • C(i)必须能成功提交,即不考虑 C(i)本身提交失败被回滚的情形,如出现就必须持续重试直至成功,或者要人工介入。

如果 T(1)到 T(n)均成功提交,那事务顺利完成,否则,要采取以下两种恢复策略之一:

  • 正向恢复(Forward Recovery):如果 T(i)事务提交失败,则一直对 T(i)进行重试,直至成功为止(最大努力交付)。这种恢复方式不需要补偿,适用于事务最终都要成功的场景,譬如在别人的银行账号中扣了款,就一定要给别人发货。正向恢复的执行模式为:T(1),T(2),…,T(i)(失败),T(i)(重试)…,T(i+1),…,T(n)。
  • 反向恢复(Backward Recovery):如果 T(i)事务提交失败,则一直执行 C(i)对 T(i)进行补偿,直至成功为止(最大努力交付)。这里要求 C(i)必须(在持续重试后)执行成功。反向恢复的执行模式为:T(1),T(2),…,T(i)(失败),C(i)(补偿),…,C(2),C(1)。

SAGA 必须保证所有子事务都得以提交或者补偿,但 SAGA 系统本身也有可能会崩溃,所以它必须得有高可靠和高可用设计。在宕机恢复后仍然可以追踪到子事务的执行情况,譬如执行至哪一步或者补偿至哪一步了。

严谨的保证正向或者逆向恢复不是容易的,所以SAGA 事务一般不会直接靠裸编码来实现,而是借助分布式事务中间件来完成,例如Seata。

参考资料
凤凰架构:构建可靠的大型分布式系统 | 凤凰架构 (icyfenix.cn)

标签:事务,本地,SAGA,数据源,提交,全局,参与者,分布式
From: https://www.cnblogs.com/cd-along/p/18213994

相关文章

  • 记录一次Redisson使用synchronized和分布式锁不生效的原因
    最近在开发的过程中,遇到了一个并发场景,用户进行方案复制的时候,当快速点击两次操作的时候,出现了复制方案重名的情况,实际上是复制方案的方案名称,是由后端根据数据库已有的方案名称和当前要复制的方案名称进行逻辑处理,保证方案名称不能重复,比如:要复制的方案名称为“我的方案”,......
  • git分布式版本控制系统(一)
    目前世界上最先进的分布式版本控制系统官方网址:https://git-scm.com学习目标:1了解git前世今生2掌握git基础概念、基础操作3各种git问题处理4互联网常用gitflow(工作流程规范)5git代码提交规范6git分支管理及命名规范版本控制系统发展史1.1本地版......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......
  • [基础]tfcenter mount将Webdav服务挂载成本地磁盘(可显示使用空间)
    1、下载tfcentermount软件(1)点击官网 tfcenter官网 后下载挂载软件(2)以windows挂载为例,下载windows软件包(3)解压软件包,如下图所示2、配置tfcenter挂载(1)以管理员方式运行上图的tfcenter-mount.bat文件选择1安装tfcentermount服务到系统中选择3启动tfcentermount服务......
  • 因为喜欢写日记,我做了一个跨平台的本地日记APP
    项目由来年少时,对未来总是充满幻想,不时陷入沉思(上课经常溜号)。我时常会想:假如未来的我,回望过去,渴望了解我年少时的心路历程,想要知道我曾经想过什么、做过什么,有什么办法?时光机?不现实。写日记?尚可。于是乎,日记一本又一本,不仅记录了初、高中时期的点点滴滴,还承载了我的青......
  • 大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了
    (实验一搭建hadoop伪分布式)--------------------------------------------------------------------------------------------------------------------------------一、实验目的1.理解Hadoop伪分布式的安装过程实验内容涉及Hadoop平台的搭建和配置,旨在提高对大数据处理框......
  • 因为喜欢写日记,我做了一个跨平台的本地日记APP
    项目由来年少时,对未来总是充满幻想,不时陷入沉思(上课经常溜号)。我时常会想:假如未来的我,回望过去,渴望了解我年少时的心路历程,想要知道我曾经想过什么、做过什么,有什么办法?时光机?不现实。写日记?尚可。于是乎,日记一本又一本,不仅记录了初、高中时期的点点滴滴,还承载了我的青春年华......
  • linux 用脚本定义全局变量
    新建一个脚本比如gvar.sh然后可以在里面添加全局变量exportCC_PREFIX=/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.2exportPATH=$CC_PREFIX/bin:$PATHexportLD_LIBRARY_PATH=$CC_PREFIX/lib:$LD_LIBRARY_PATHexportLD_LIBRARY_PATH=$CC_PREFIX/loo......
  • WPF 加载本地HTML
    index.html代码高亮:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>jQuery语法高亮示例</title><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/a......
  • VMware上基于centos系统完全分布式Hadoop集群的搭建详解
    目录1.centos系统的环境的准备1.1.样本机的配置1.1.1.准备一个centos的虚拟机1.1.2.关闭系统的防火墙1.1.3.配置centos系统的IP1.1.4.修改主机名称1.1.5. 配置hosts映射文件1.2.jdk的安装1.2.1.jdk的下载1.2.2.虚拟机自带jdk的删除1.2.3.将jdk上传到虚拟机中1.2.4......