当前位置: 首页 > news >正文

分布式 分布式事务 总结

前言


 相关系列

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

分布式事务


    所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节点。而如果将这个交易的所有操作作为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事务时间拉长。

相关文章:

分布式 分布式事务 总结

前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…...

onnx文件转pytorch pt模型文件

onnx文件转pytorch pt模型文件 1.onnx2torch转换及测试2.存在问题参考文献 从pytorch格式转onnx格式,官方有成熟的API;那么假如只有onnx格式的模型文件,该怎样转回pytorch格式? https://github.com/ENOT-AutoDL/onnx2torch提供了…...

智能座舱人机交互升级

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…...

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现

RabbitMQ是一个广泛使用的开源消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ支持多种消息传递模式,其中最基本的是点对点(Point-to-Point)通讯方式。在这种模式下,消息生产者将消息发…...

爬虫实战:获取1688接口数据全攻略

引言 在电商领域,数据的重要性不言而喻。1688作为中国领先的B2B电商平台,提供了海量的商品数据。通过爬虫技术获取这些数据,可以帮助企业进行市场分析、价格监控和供应链管理。本文将详细介绍如何使用Python爬虫技术合法合规地获取1688接口数…...

生成树协议STP工作步骤

第一步:选择根桥 优先级比较:首先比较优先级,优先级值越小的是根桥MAC地址比较:如果优先级相同,则比较MAC地址。MAC地址小的是根桥。 MAC地址比较的时候从左往右,一位一位去比 第二步:所有非根…...

Android14 AOSP支持短按关机

修改frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java diff --git a/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/base/services/core/java/com/android/server/policy/PhoneWindowManager.java in…...

C# 和 go 关于can通信得 整理

在C#中开发CAN(Controller Area Network)通信接口时,确实有一些现成的NuGet包可以简化你的开发工作。这些库通常提供了与CAN硬件接口通信所需的基本功能,如发送和接收CAN消息。下面是一些常用的NuGet包: PCANBasic.NET…...

vue常用命令汇总

nvm 一个nodejs版本管理工具,解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 npm 可以管理 nodejs 的第三方插件。 vue-cli 是Vue提供的一个官方cli,专门为单页面应用快速搭建繁杂的脚手架。 nginx 是一个高性能的HTTP和反向代理we…...

【C++习题】18.逆波兰表达式求值

题目&#xff1a;逆波兰表达式求值 链接&#x1f517;&#xff1a;逆波兰表达式求值 题目&#xff1a; 代码&#xff1a; class Solution {public:int evalRPN(vector<string>& tokens) {stack<int> s;for (size_t i 0; i < tokens.size(); i){string&a…...

本地如何使用 yarn link 调试本地 npm 包

如何使用 yarn link 调试本地 npm 包&#xff1a; 在前端开发中&#xff0c;通常我们会开发并使用许多 npm 包来实现项目的功能。随着开发的深入&#xff0c;我们经常需要调试或修改某些 npm 包的源码。如果你正在开发一个 npm 包&#xff0c;并且希望在本地项目中进行调试&am…...

江恩45年一书的自己一点读书见解

读了下江恩的华尔街45年&#xff0c;有些浅薄的体会&#xff0c;记录下 江恩的华尔街45年里面&#xff0c;感触比较深刻的有以下几点&#xff1a; 1.为什么会亏钱 1.利用大仓位来过度交易&#xff0c;违背了资本安全的原则。买卖过于频繁 2.没有用止损单来保护你的交易。 3.缺…...

影响 Linux、Unix 系统的 CUPS 漏洞可导致 RCE

在经过大量炒作和第三方过早泄露信息之后&#xff0c;安全研究员 Simone Margaritelli 公布了有关通用 UNIX 打印系统 (CUPS) 中的四个零日漏洞的详细信息。 这些漏洞可被远程、未经身份验证的攻击者滥用&#xff0c;在易受攻击的 Linux 和类 Unix 系统上实现代码执行。 CUPS…...

【汇编】思考汇编中的两个基本问题

1. 若干年前的疑问 几年前还在大学学习汇编时&#xff0c;不管是考试还是课程设计&#xff0c;其实都很顺利。但是心里一直对什么时候使用哪个寄存器存在疑惑&#xff0c;编写汇编时&#xff0c;没有十足的把握&#xff0c;都是抱着试一试的心态去完成了课程任务。 工作八年有…...

Nest Dynamic modules 笔记

Nest Dynamic modules 文档地址&#x1f448; 记录Dynamic modules是因为确实抽象&#xff0c;文档并没有很详细的指出不同方式创建动态模块的区别 两种不同的动态模块创建方式 静态模块传统动态模块方式实现三种不同的方法命名使用ConfigurableModuleBuilder异步动态模块如果…...

生成式AI、大模型、多模态技术开发与应用学习清单

学习目的&#xff1a; 了解AIGC发展现状与核心技术。 掌握Transformer核心开发技术。掌握向量数据库的工作原理、检索算法、主要开源数据库。掌握大模型调用、微调方法。掌握以GPT大语言模型为基础的工作原理。 掌握AIGC技术在跨模态领域的应用技术。了解GPT提示工程和AIGC的安…...

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了&#xff0c;能搜到这篇文章说明你了解 总之就是一个单片机重启程序&#xff0c;设定好超时时间&#xff0c;在超时时间内没有喂狗&#xff0c;单片机就会复位 主要应用在单片机异常重启方面&#xff0c;比如程序跑飞&#xff08;注意程序跑飞时你就…...

网络安全渗透测试概论

渗透测试&#xff0c;也称为渗透攻击测试是一种通过模拟恶意攻击者的手段来评估计算机系统、网络或应用程序安全性的方法。 目的 旨在主动发现系统中可能存在的安全漏洞、脆弱点以及潜在风险&#xff0c;以便在被真正的恶意攻击者利用之前&#xff0c;及时进行修复和加固&…...

【大数据技术基础】【记录Ubuntu 16.04升级到18.04】Ubuntu的一个版本升级到另一个版本

在 Ubuntu 操作系统中进行软件更新和系统升级 Ubuntu Kylin 16.04 LTS 系统进行系统升级到 Ubuntu 18.04.6 LTS 版本 升级提示&#xff1a;系统弹出提示框&#xff0c;告知用户有新版本的 Ubuntu 可用&#xff0c;询问用户是否想要升级。 认证窗口&#xff1a;显示了一个认证…...

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…...

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…...

CNCF云原生生态版图-项目和产品综合分析

CNCF云原生生态版图-项目和产品综合分析 CNCF云原生生态版图-项目和产品综合分析整体统计分析中国研发人员贡献项目和产品其中&#xff0c;纳入 CNCF 管理的开源项目 链接 CNCF云原生生态版图-项目和产品综合分析 整体统计分析 在对云原生技术选型时&#xff0c;优先选择经过 …...

MySQL生产环境备份脚本

全量备份脚本&#xff0c;其中BakDir&#xff0c;ZlbakDir&#xff0c;LogFile需要自己创建 #!/bin/bash export LANGen_US.UTF-8# 指定备份目录 BakDir/root/beifen/data/mysqlbak/data/allbak # 指定增量备份目录 ZlbakDir/root/beifen/data/mysqlbak/data/zlbak # 备份日志…...

leetcode 3224. 使差值相等的最少数组改动次数

题目链接&#xff1a;3224. 使差值相等的最少数组改动次数 题目&#xff1a; 给你一个长度为 n 的整数数组 nums &#xff0c;n 是偶数 &#xff0c;同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中&#xff0c;你可以将数组中任一元素替换为 0 到 k 之间的任一…...

多线程动态库里面调用静态库分配内存函数导致的崩溃cltp汇编指令导致

1、概述 有这样的一个场景,我有一个动态库myso.so里面有函数start_crash()&#xff0c;用到静态库的内存分配函数&#xff0c;其实静态库里面的static.a 里面就封装了一个函数叫system_malloc(),函数返回的是分配的内存地址&#xff0c;然后发现&#xff0c;我在测试demo里面创…...

力扣刷题TOP101: 31.BM38 在二叉树中找到两个节点的最近公共祖先

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的&#xff1a; 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找o1 和 o2 的最近公共祖先节点。 思路 这个任务目和上一题在二叉搜索树中找到两个节点的最近公共祖先有点类…...

前端项目打包部署

打包和部署前端项目是将开发环境中的代码转化为生产环境可直接运行的静态文件&#xff0c;并将其部署到服务器上的过程。 # 项目打包 pnpm run build# 上传文件至远程服务器 将本地打包生成的 dist 目录下的所有文件拷贝至服务器的 /usr/share/nginx/html 目录。# nginx.cofig…...

《CSS 知识点》大屏卡片布局思路:弹性布局 flex-grow

思路 大屏左右两侧高宽一致&#xff0c;内部卡片可按比例设置&#xff01; 使用弹性布局和属性 flex-grow 设置比例&#xff1b;间隔使用 margin-bottom 设置&#xff0c;最后一个卡片不设置&#xff1b; 效果如图 代码说明 CSS代码 26 - 30&#xff0c;左右两侧设置弹性布…...

nVisual 登录页页面配置说明

一、概述 nVisual登录页面可根据具体客户需要通过public\config\access.js文件进行自定义配置。页面可以大致分为4个部分&#xff0c;头部、底部、可移动区域以及页面中间的信息填写区域。其中头部和底部又包含头部左侧、头部中间、头部右侧、底部左侧、底部中间、底部右侧六个…...

后端接受前端传递数组进行批量删除

问题描述&#xff1a;当我们需要做批量删除功能的时候&#xff0c;我们循环单次删除的接口也能进行批量删除&#xff0c;但要删除100条数据就要调用100次接口&#xff0c;或者执行100次sql&#xff0c;这样系统开销是比较大的&#xff0c;那么我们直接采用接收的数组格式数据sq…...