分布式事务的二阶段提交和三阶段提交

2023-10-27

分布式事务:是指存在多个跨库事务的事务一致性问题,或者是指分布式架构下由多个应用节点组成的多个事务之间的事务一致性问题。

在单点服务时,某电商会员购买上市时会出现以下情况

  1. 开启数据库事务
  2. 创建订单
  3. 会员积分减少
  4. 商品库存减少
  5. 提交数据库事务

这样的话,在一个数据库事务中,就可以完成所有操作,利用数据库的原子保证了所有数据那么全部处理成功,要么全部回滚撤销,但是放在以微服务为代表的分布式架构下,问题就没有那么简单了,下面是一个分布式应用的示意图

 可以看到,商城应用作为业务的发起者,分别向订单服务、会员服务、库存服务发起了调用,而这些服务又有自己独立的数据存储,因为在物理上,各个数据库服务器都是独立的,每一个操作都会创建独立的事务,这就意味着在分布式事务处理时,无法通过单点数据库利用一个事务保证数据的完整性,我们必须引入某种机制来协调多个事务,要么全部提交,要么全部回滚,以此保证事务的完整性,这就是分布式事务的由来,在分布式事务中,有两种经典的解决方案:二阶段提交和三阶段提交


二阶段提交

下面是二阶段提交的第一个阶段:事务预处理阶段

 相比较于单点事务,分布式事务中新增了一个角色——事务协调者,它的职责时协调各个分支事务的开启与提交、回滚的处理

以上图为例,订单创建后,首先事务协调者会向各服务下达处理本地事务的通知,所谓本地事务就是每个服务应该做的事情,如订单服务负责创建新的订单记录,会员服务负责增加会员的积分,库存服务负责减少库存,在这个阶段,被操作的所有数据都处于未提交的状态,会被本地数据库的排他锁锁定。当本地事务处理完成后,会通知事务协调者本地事务处理完毕,当事务协调者陆续收到订单服务、会员服务、库存服务的处理完毕通知后,并进入二阶段提交的提交阶段


提交阶段

 在提交阶段,事务协调者会向每一个服务下达提交命令,每个服务收到提交命令后,对阶段一中未提交的数据进行commint操作,完成数据最终的写入,之后服务向事务协调者上报事务提交成功的通知,当事务协调者收到所有服务提交成功的通知后,就意味着一次分布式事务处理成功,这便是二阶段提交的正常过程。

但是,假设在阶段一中,有任何一个服务因某种原因向事务协调者上报事务处理失败,就意味着整体事务处理出现问题,阶段二的操作就自动转为回滚处理,将所有未处理的数据撤销,还原以保证完整性

对于二阶段提交来说,它有一个致命问题,当阶段二某个服务因为网络原因无法收到事务协调者下达的命令,则未提交的数据会造成长时间堵塞,可能会导致系统崩溃

以下图为例

 如果在提交阶段,库存服务实例与事务协调者之间断网,提交指令无法下达,这会导致库存中飞科剃须刀商品记录会长期处于未提交的状态,因为这条记录被数据库排他锁长期独占,之后有其他线程访问飞科剃须刀库存数据,该线程就会长期处于堵塞状态,随着堵塞线程的不断增加,库存的服务会面临崩溃的风险,解决这个问题的办法是,在服务这一侧增加超时机制,过一段时间,被锁定的飞科剃须刀因超时自动执行提交操作,释放锁定资源,尽管这样做,可能会导致数据不一致,但比线程挤压导致服务崩溃要好

为了解决二阶段的问题,三阶段提交的方案就出现了


三阶段提交

 三阶段提交实质是将二阶段提交中的提交阶段拆分为预提交阶段与提交阶段,同时在服务端都引入超时机制,保证数据库资源不会被长时间锁定

 下面是三阶段提交的第一个阶段:事务预处理阶段

阶段一:事务预处理阶段

3pc的事务预处理阶段与2pc的事务预处理阶段是一样的,用于处理本地事务,锁定数据库资源,当所有服务返回成功后,进入阶段二


阶段二:预提交阶段

 预提交阶段只是一个询问机制,已确认所有服务已准备好,同时事务协调者与参与者都设置了超时时间,防止出现资源长时间被锁定,当阶段二所有服务返回可以提交,进入阶段三——提交阶段


阶段三:提交阶段 

 

3pc的提交阶段与2pc的提交阶段是一致的,在每一个数据库中,执行提交,实现资源的写入,如果事务协调者与服务通信中断导致无法提交,在服务端超时后自动执行提交操作,来保证资源释放


通过对比,我们发现,三阶段提交是二阶段提交的优化版本,主要通过加入预提交阶段引入超时机制,让数据库不会被长期锁定,但这也带来一个新问题,数据一致性可能因为超时后的强制提交被破坏,对于这个问题,有的方案是增加异步的数据补偿任务,日中跑批前的数据补偿,更完善的业务数据完整性的校验代码,引入数据监控及时通知人工补录

分布式事务常见的解决方案:

第一种:基于XA协议的强一致性事务方案

Atomic

Seata里面的XA事务模型

基于CAP理论可以知道,如果要保证分布式事务的强一致性,就必然会带来性能上的影响,从而去影响到可用性,所以强一致性事务的性能会比较低,

第二种:基于BASE理论下的弱一致性事务解决方案

比如说TCC事务模型以及基于可靠性消息的最终数据一致性,Seata的Saaga事务模型

最终一致性事务损失数据的强一致性,然后通过异步补偿的方式去达到数据的最终一致性,在性能上会比强一致性事务要好很多,所以适合在一些并发量比较高的场景里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式事务的二阶段提交和三阶段提交 的相关文章

随机推荐

  • Azkaban的囚徒——Azkaban运行模式和流

    文章目录 Azkaban运行模式 Azkaban运行 Azkaban 流 Job Dependency Azkaban运行模式 在3 x版本里 提供了3种运行模式 the stand alone solo server mode stand
  • 服务器安装系统要如何载入驱动程序,Dell 服务器安装Windows 2008 R2时手动加载阵列卡驱动...

    使用操作系统光盘或U盘安装操作系统 需要事先准备好对应的阵列卡驱动 安全完成后需要自行手动加载主板 显卡 网卡驱动 1 开机之后通过界面提示通过键盘按下 F11 进入 Boot Manager 选择启动选项 2 在 Boot Manager
  • Oracle 数据库索引扫描方式

    1 索引范围扫描 Index Range Scan 当我们在查询操作中使用了 WHERE 子句进行范围查询时 Oracle 数据库会使用索引范围扫描方式 这种扫描方式通过索引键值的范围来定位需要的数据 例如 我们有一个名为 orders 的
  • 2012.11.20

    昨晚到23 50 实在是困了 于是睡了 发现 杆9其实是个虚拟杆 也就是说 相当于一个辅助线 不INITGEOMETRY 不绘制 只计算 现在设定P1的点 根据余弦定理求出 三角形P1P2P3中 P2对应的角度 a 2 b 2 c 2 2b
  • 为学生夫妻安排一间宿舍两张床,武大的回应亮了

    来源 中国青年报综合自武汉大学官微 身高太高 睡不下宿舍的床咋办 行动有障碍 不方便睡上下铺咋办 第一次来到南方 湿度太大怎么晾衣服 学生夫妻可以申请合宿吗 这两天 武大 宿舍定制服务 在网上刷屏 引发关注 1 学校为 持证上岗 的夫妻档准
  • python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器 firefox ie chrome safari 本次我们已win 10中的ie为例 来看看如何使用python3 robotframework seleniu
  • 一次SpringBoot版本升级,引发的血案

    前言 最近项目组升级了SpringBoot版本 由之前的2 0 4升级到最新版本2 7 5 却引出了一个大Bug 到底是怎么回事呢 1 案发现场 有一天 项目组的同事反馈给我说 我之前有个接口在新的测试环境报错了 具体异常是 Missing
  • Git基本操作命令

    目录 一 简介 二 基本命令使用 1 git add 将该文件添加到暂存区 2 git status 命令用于查看在上次提交之后是否有对文件进行再次修改 3 git diff 比较文件在暂存区和工作区的差异 4 git commit 将暂存
  • [NOIP2014]珠心算测验 T1

    珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术 珠心算训练 既能够开发智力 又能够为日常生活带来很多便利 因而在很多学校得到普及 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法 他随机生成一个正整数集合 集合中的
  • go Hijack

    golang GO语言 http详解简单基础 1 因为好像长时间的写PHP可能大家感觉烦躁了 所以写一点golang的东西大家可以拿去玩玩 golang在web开发中让你得心应手 其实也是很好的东西 只要你玩进去之后感觉好爽 感觉比PHP的
  • 网络安全笔记5——数字签名

    网络安全笔记5 数字签名 参考课程 中国大学MOOC 网络安全 北京航空航天大学 文章目录 网络安全笔记5 数字签名 基本概念 分类 数学表示 RSA数字签名机制 ElGamal数字签名机制 Schnorr数字签名机制 DSS数字签名机制
  • 未能找到任何适合于指定的区域性或非特定区域性的资源

    试了所有的方法都不行 最后把resx文件删了 重新添加图片图标 ok
  • UVa 133 The Dole Queue(圈的下标处理)

    本题难点在于用数组处理圈状物时下标的计算 include
  • C++下几种新的数据类型

    一 CString 用法 CString s 123 对应库 include
  • 如何查看是否安装了java环境?

    一 win R 输入cmd 二 回车后进入cmd界面 三 在cmd窗口中输入java 若提示 java 不是内部或外部命令 也不是可运行的程序或批处理文件 则表示未安装JRE 这个错误提示表明系统无法找到 java 程序 可能是由于 Jav
  • Datatables

    1 10 x与1 9 x参数名对照表 Datatables 1 10 x在命名上与1 9 x的有区别 新版的使用的是驼峰的命名规则 而之前的是采用匈牙利命名规则 当然 这些变化都是向下兼容的 你可以继续使用旧版本的api方法的参数和名称 如
  • MongoDB安装配置详细教程

    1 安装平台 windows win7 win10均可 2 MongoDB安装包下载 MongoDB的安装包下载地址 https www mongodb com download center atlas 3 安装过程 1 运行下载的msi
  • 搞笑幽默段子-1(仅供娱乐)

    老师问小明 小明 你昨天为什么没来上课 小明回答 老师 我昨天去办事 结果碰到一只猪 我和它相视了一会儿 然后它居然把我当成兄弟 跟着我进了学校 我只好带着它一起上课 老师一脸错愕 你确定那只猪跟着你一起进了学校 小明犹豫片刻 回答 老师
  • node实现文件上传(1)

    1 FormData对象 以对象的方式来表示页面中的表单 又称为表单对象 以key value的方式来保存数据 XMLHttpRequest对象可以轻松的表单对象发送的服务器端 1 是一个构造函数 new FormData 2 常用的API
  • 分布式事务的二阶段提交和三阶段提交

    分布式事务 是指存在多个跨库事务的事务一致性问题 或者是指分布式架构下由多个应用节点组成的多个事务之间的事务一致性问题 在单点服务时 某电商会员购买上市时会出现以下情况 开启数据库事务 创建订单 会员积分减少 商品库存减少 提交数据库事务