分布式 分布式事务 总结

news2024/12/22 21:30:53

前言


 相关系列

  • 《分布式 & 目录》
  • 《分布式 & 分布式事务 & 总结》
  • 《分布式 & 分布式事务 & 问题》
     
     

分布式事务


    所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节点。而如果将这个交易的所有操作作为ACID事务执行,那么该事务就被称为分布式事务。
 
 

2PC @ 2 Phase Commit @ 二阶段递交


    2PC&3PC协议是处理分布式事务数据一致性(与CAP理论的一致性不同,事务的一致性是指确保数据在两个“合法”状态间的“正确转移”)问题的解决方案,其本质是通过确保事务的原子性来保证一致性。在分布式系统中,节点虽然可以知晓自身操作的成功与否,但却无法知晓其他节点操作的执行结果。因此当事务跨越多个节点时,为了保持事务的原子性&一致性,需要引入了TM @ 事务管理器来统一掌握所有RM @ 资源管理器的操作结果,并决定是否把各资源管理器的操作结果统一提交/回滚。2PC协议分为准备&提交两个阶段:

  • Prepare phase @ 准备阶段:事务管理器会向所有资源管理器发送(2PC/3PC/TCC协议都只是分布式事务的实现思想,因此事务管理器对资源管理器的请求发送无需在意串/并行,但具体的实现工具/框架就必须考虑这一点,因为各个资源管理器事务之间可能存在依赖性,例如事务B的执行需要事务A的执行结果参与)“准备”请求以确认其是否已准备好递交事务。资源管理器在收到“准备”请求后会开启&执行本地事务,但并不真正递交,而是将Undo和Redo日志写入本地事务日志中。Undo日志用于记录如何回滚事务,而Redo日志则用于在提交阶段重新执行事务操作。尽管在2PC中通常不直接使用Redo日志提交,但它在某些故障恢复场景中是有用的。本地事务执行结束后,将成功与否以Yes/No的形式回应至事务管理器;
  • Commit phase @ 递交阶段:如果事务管理器收到所有反馈且发现资源管理器都已成功执行本地事务则会决定提交事务,否则就回滚事务。各节点在收到事务管理器发送的“递交/回滚”请求后会统一将各自的执行结果递交/回滚。

在这里插入图片描述
 

缺点

  • 同步阻塞:在整个分布式事务未结束前,所有资源管理器(的事务涉及业务)都会处于阻塞状态;
  • 单点故障:事务管理器是整个分布式事务的核心,如果事务管理器宕机,那么所有资源管理器都会被锁定而无法继续执行;
  • 数据不一致:二阶段如果出现网络分区/节点宕机而导致部分资源管理器未收到事务递交指令/事务递交失败,那么就会出现数据不一致的情况。
     
     

3PC @ 3 Phase Commit @ 三阶段递交


    3PC协议在2PC协议的基础上引入了检查/超时机制,用于避免/处理2PC的“同步阻塞/单点故障/数据不一致”问题。3PC协议分为以下三个阶段:

  • CanCommit @ 可/询问递交:事务管理器向各资源管理器询问是否可以支持执行/提交事务。各资源管理器接收到询问后根据自身情况向事务管理器返回Yes/No回应。如果事务管理器没有在指定时间内接收到所有回应/接收到No回应,则分布式事务中断/取消。可/询问递交阶段是3PC协议引入的新阶段,目的是事先检查资源管理器的状态能否支持分布式事务的执行/递交,从而避免无意义的分布式事务执行以增强协议的可靠性&容错率;
  • PreCommit @ 预提交:在接收到所有Yes回应的情况下,分布式事务会进入预递交阶段。该阶段中事务管理器会向各资源管理器发送预递交请求,而接收到请求的各资源管理器会开启&执行本地事务但不递交,并将Undo和Redo日志写入本地事务日志中,随后向事务管理器发送Ack回应。而如果事务管理器没有在指定时间内接收到所有Ack回应/接收到Abort回应,则事务管理器会向各资源管理器发送Abort请求,从而令各资源管理器回滚本地事务。而在这阶段中如果部分已开启&执行本地执行的资源管理器未能在指定时间内接收到Abort请求,则其也会因为超时而自动回滚本地事务;
  • DoCommit @ 最终提交:在接收到所有Ack回应后,分布式事务会进入最终递交阶段。该阶段中事务管理器会向各资源管理器发送最终递交请求,而接收到请求的各资源管理器会递交事务,并向事务管理器发送Ack回应表示事务递交已完成。注意!该阶段中而如果有部分资源管理器未能在指定时间内接收到最终递交请求,则该资源管理器就可能因为超时而自动回滚本地事务,从而无法保证分布式事务的原子性,并进一步破坏数据一致性。因此3PC协议同样无法完全避免2PC协议的数据不一致问题。
     

优点

  • 可靠性&容错率提升:检查机制增强了分布式事务的可靠性&容错率;
  • 超时机制减少了对阻塞时间:超时机制减少了资源管理器等待事务管理器指令的阻塞时间;
  • 减少了单点故障对系统的影响:超时机制降低了事务管理器单点故障对系统的影响。
     

缺点

  • 复杂性增加:3PC协议相比2PC协议而言需要处理更多状态转换&超时逻辑,这为增加了实现的难度&出错的可能性;
  • 性能开销:更复杂的流程同步带来了是性能开销的增加;
  • 数据不一致:3PC协议依然未能解决数据不一致问题,虽然检查&超时有助于降低这一点,但网络分区造成的数据不一致问题依然是存在的。
     
     

TCC @ Try Confirm Cancel @ 尝试确认取消


    TCC协议是一种不同于2PC/3PC协议的分布式事务解决方案,其核心思想是“补偿机制”,即在分布式事务出现异常/失败时通过执行相反的操作来补偿之前的行为,从而达到事务的一致性。TCC将分布式事务划分为以下三个阶段:

  • Try @ 尝试:事务管理器向事务协调器申请开启分布式事务并获得全局事务ID,随后将该全局事务ID发送至各资源管理器。资源管理器接收到全局事务ID后会向事务协调器注册分支事务ID,从而将分支事务ID纳入该全局事务ID下管理。此后资源管理器便会开启&执行本地事务并预留必要的资源,以便后续递交事务时使用,并向事务管理器报告当前分支事务的开启&执行情况;
  • Confirm @ 确认:如果在尝试阶段中的所有的资源管理器都成功开启&执行了本地事务,那么分布式事务就会进入确认阶段。在确认阶段中事务管理器会向各资源管理器发送确认请求,从而令其能够真正的递交事务,并于事务管理器中标记分支事务已成功递交;
  • Cancel @ 取消:如果在尝试&确认阶段中存在资源管理器未能成功开启&执行&递交本地事务的情况,那么分布式事务就会进入取消阶段。在取消阶段中事务管理器会向各资源管理器发送取消请求,从而回滚尚未递交的事务/执行相反的操作弥补已递交的事务,并于事务管理器中标记分支事务已成功取消。而对于因为各种原因未能接收到取消请求的资源管理器,由于超时机制的存在其也会自动执行取消行为,从而极大程度的确保了事务的原子性。
     

优点

  • 极大确保了原子性:补偿机制的存在使得已递交的事务也可以被取消,从而降低因为网络分区而数据不一致的风险;
  • 避免数据库锁冲突的低性能风险:TCC通过将数据库的二阶段提交上升到微服务来实现,避免了数据库二阶段提交中锁冲突导致的长事务低性能风险;
  • 异步高性能:TCC采用了先try检查,然后异步实现confirm的方式,提高了系统的性能和可扩展性。
     

缺点

  • 侵入性强:微服务的每个事务都必须实现Try/Confirm/Cancel三个方法,增加了开发成本和后期维护改造的成本;
  • 等幂性:为了达到事务的一致性要求,Try/Confirm/Cancel接口必须实现等幂性操作,这增加了实现的复杂性;
  • 事务日志损耗性能:事务管理器需要记录事务日志,这必定会损耗一定的性能,并可能使得整个TCC事务时间拉长。

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

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

相关文章

【蓝桥杯每日一题】重新排序

重新排序 2024-12-8 蓝桥杯每日一题 重新排序 前缀和 差分 题目大意 给定一个数组 A 和一些查询 L i , R i Li_,R_i Li,​Ri​, 求数组中第 L i L_i Li​至第 R i R_i Ri​个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能…

jupyterlab 增加多个kernel,正确做法

1、背景 需要增加一个kernel然后相当于隔离一个环境 juypterlab Version 3.0.14 2、用conda 安装 例如,你在conda下有一个python 3.12 的环境 py312 ipython kernel install --user --namepy312 如果保持的话,用pip安装相应的包就好 3、检查是否配置好 …

uni-app 组成和跨端原理 【跨端开发系列】

🔗 uniapp 跨端开发系列文章:🎀🎀🎀 uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…

KV Shifting Attention Enhances Language Modeling

基本信息 📝 原文链接: https://arxiv.org/abs/2411.19574👥 作者: Mingyu Xu, Wei Cheng, Bingning Wang, Weipeng Chen🏷️ 关键词: KV shifting attention, induction heads, language modeling📚 分类: 机器学习, 自然语言处…

算法-字符串-72.编辑距离

一、题目 二、思路解析 1.思路&#xff1a; 最少操作数——动态数组 res[i][j]:长度为i的字符串转化为长度为j字符串的最少操作 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.情况一&#xff1a;当word1为空&#xff0c;word2不为空时 for(int i0;i<size2;i){res[0…

云开发实战教程:手把手教你高效开发应用

声明&#xff1a;本文仅供实践教学使用&#xff0c;没有任何打广告成分 目录 1.引言 2.云开发 Copilot介绍 云开发 Copilot 的功能与特点 3.环境准备 步骤一登录账号 步骤二新建环境 4.开发实践 4.1AI 生成低代码应用 4.2AI 生成低代码页面/区块 4.3AI 优化低代码组件…

Linux笔记9 DNS域名解析服务器

简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分 布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS使用的是53端口&#xff0c; 通常DNS是以UDP这个较快速的数据传输协议来查询的&#x…

编程的“超能力”:解锁 MarsCode AI 的智能助手

文章目录 前言MarsCode AI 提供的超能力**1. 代码补全 | Code Completion**你是否曾卡在函数的中途&#xff0c;不知道下一行该怎么写&#xff1f;MarsCode AI 就是你的灵感缪斯&#xff01;示例 **2. 代码解释 | Explain Code**“这段代码是干嘛的&#xff1f;”当你面对团队老…

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

提升搜索体验!—— 推出 Elastic Rerank 模型(技术预览版)

作者&#xff1a;来自 Elastic Shubha Anjur Tupil 几分钟内即可开始使用 Elastic Rerank 模型&#xff1a;强大的语义搜索功能&#xff0c;无需重新索引&#xff0c;提供灵活性和成本控制&#xff1b;高相关性、顶级性能和文本搜索效率。 使用我们全新的先进跨编码器 Elastic …

STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?

主要问题&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模拟IIC&#xff0c;SCL和SDA口配置为推挽输出上拉&#xff0c;主要是SDA脚&#xff0c;每次都要输出输入模式重新配置&#xff0c;虽然也能通信&#xff0c;但不稳定&#xff0c;出错率大&#xff1b; 2&…

Windows11和Ubuntu用PointNet++训练自己的数据集(部件分割模型)

省流&#xff1a; &#xff08;1&#xff09;不管是Linux还是Windows都不影响&#xff0c;只要有pycharm或者vscode即可&#xff0c;啥系统都行。 &#xff08;2&#xff09;此外由于自己的需求&#xff0c;所以只做物体部件分割&#xff08;partseg&#xff09;任务&#xff0…

【git】git回退到之前版本+拓展git命令

一、问题 git提交有时候会出错&#xff0c;想回退到之前的版本 1、命令git reset --soft <commit_id> commit_id【回退到的编号】 2、git push --force-with-lease origin <branch_name> branch_name【分支名】 二、拓展 1、git bash 1、进入任意磁盘 cd 磁盘…

Golang使用etcd构建分布式锁案例

在本教程中&#xff0c;我们将学习如何使用Go和etcd构建分布式锁系统。分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要。它有助于维护一致性&#xff0c;防止竞争条件&#xff0c;并确保在任何给定时间只有一个进程独占访问资源。 我们将使用Go作为编程语言&am…

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置

一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景&#xff0c;支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警…

element-plus的el-tree的双向绑定

el-tree改造了下 可选可取消 有默认值 不包含父级id&#xff08;也可打开注释 包含父级id&#xff09; 默认展开 点击节点也可触发选择 节点内容自定义 <template><div class"absolute"><el-scrollbar class"pall"><div class"…

微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档

要解决此问题&#xff0c;需打开微信小程序开发者工具进行设置&#xff0c;打开详情-本地设置重新运行&#xff0c;该报错就没有啦

医疗系统国产数据库高质量发展路径探析

信息工程人员操作数据库 一、国外数据库在医疗系统中的困境 &#xff08;一&#xff09;数据分散与难以整合 在美国&#xff0c;分散式医疗服务成为癌症研究数据库优化的巨大障碍。患者先在社区接受肿瘤科医生常规检查&#xff0c;再到学术医疗中心进行尖端治疗&#xff0c;然…

C语言——验证“哥德巴赫猜想”

问题描述&#xff1a; 验证"哥德巴赫猜想" 任何一个大于2的偶数都可以表示为两个质数之和。例如&#xff0c;4可以表示为22&#xff0c;6可以表示为33&#xff0c;8可以表示为35等 //验证"哥德巴赫猜想" //任何一个大于2的偶数都可以表示为两个质数之和…

Windows平台Unity3D下RTMP播放器低延迟设计探讨

技术背景 好多开发者希望我们分享下大牛直播SDK是如何在Unity下实现低延迟的RTMP播放的&#xff0c;以下是一些降低 Unity 中 RTMP 播放器延迟的方法&#xff1a; 一、选择合适的播放插件或工具 评估和选用专业的流媒体插件 市场上有一些专门为 Unity 设计的流媒体插件&…