# 分布式理论协议与算法 第二弹 ACID原则

news2024/11/23 3:22:44

ACID 原则是在 1970年 被 Jim Gray 定义,用以表示事务操作:一个事务是指对数据库状态进行改变的一系列操作变成一个单个序列逻辑元操作,数据库一般在启动时会提供事务机制,包括事务启动 停止 取消或回滚。

但是上述事务机制并不真的实现“事务”,一个真正事务应该遵循 ACID 属性,ACID 事务才真正解决事务,包括并发用户访问同一个数据表记录的头疼问题。ACID事务解决了很多问题,但是仍然需要和性能做平衡协调,事务越强,性能可能越低,安全可靠性和高性能是一对矛盾。

本篇内容主要包括:ACID 理论概述、2PC 协议、3PC 协议


文章目录

    • 一、ACID 理论概述
        • 1、ACID 简介
        • 2、ACID 定义
        • 3、CAP 和 ACID 一致性区别
        • 4、分布式系统下 ACID 的协议
    • 二、2PC 协议
        • 1、2PC(两阶段提交)概述
        • 2、第一阶段:提交事务请求
        • 3、第二阶段:事务执行
        • 4、2PC 主要缺点
    • 三、3PC 协议
        • 1、改动点
        • 2、第一阶段:CanCommit
        • 3、第二阶段:PreCommit
        • 4、第三阶段:DoCommit
        • 5、3PC 的优缺点


一、ACID 理论概述

1、ACID 简介

ACID 原则是在 1970年 被 Jim Gray 定义,用以表示事务操作:一个事务是指对数据库状态进行改变的一系列操作变成一个单个序列逻辑元操作,数据库一般在启动时会提供事务机制,包括事务启动 停止 取消或回滚。

但是上述事务机制并不真的实现“事务”,一个真正事务应该遵循 ACID 属性,ACID 事务才真正解决事务,包括并发用户访问同一个数据表记录的头疼问题。ACID事务解决了很多问题,但是仍然需要和性能做平衡协调,事务越强,性能可能越低,安全可靠性和高性能是一对矛盾。

2、ACID 定义

ACID 可以理解为 ACID 最重要的含义,就是 Atomicity 和 Isolation ,即强制一致性,要么全做要么不做,所有用户看到的数据一致。强调数据的可靠性, 一致性和可用性。

ACID 为 Atomicity、Consistency、Isolation and Durability,其中 ACID 分别表示为:

  • 原子性(Atomicity):事务中的操作要么都做,要么都不做。
  • 一致性(Consistency):系统必须始终处在强一致状态下。
  • 隔离性(Isolation):一个事务的执行不能被其他事务所干扰。
  • 持续性(Durability):一个已提交的事务对数据库中数据的改变是永久性的。

保证 ACID 是传统关系型数据库中事务管理的重要任务,几种事务类型为:未提交读、可提交读、可重复读、可序列化。

3、CAP 和 ACID 一致性区别

ACID 一致性是有关数据库规则,如果数据表结构定义一个字段值是唯一的,那么一致性系统将解决所有操作中导致这个字段值非唯一性的情况,如果带有一个外键的一行记录被删除,那么其外键相关记录也应该被删除,这就是 ACID 一致性意思。

CAP 理论的一致性是保证同样一个数据在所有不同服务器上的拷贝都是相同的,这是一种逻辑保证,而不是物理,因为光速限制,在不同服务器上这种复制是需要时间的,集群通过阻止客户端查看不同节点上还未同步的数据维持逻辑视图。

当跨分布式系统提供 ACID 时,这两个概念会混淆在一起,Google’s Spanner system 能够提供分布式系统的ACID,其包含 ACID+CAP 设计:

acid.png

4、分布式系统下 ACID 的协议

分布式系统下类比 ACID 的强一致性协议有 2PC、3PC、Paxos、Raft、Quorum NWR …


二、2PC 协议

1、2PC(两阶段提交)概述

在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的结果。所以需要引入一个作为协调者,统一掌控所有节点(称作参与者)的操作结果,并决定最终结果。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

img

所谓的两个阶段分别是:

  • 第一阶段:准备阶段(投票阶段)
  • 第二阶段:提交阶段(执行阶段)

2、第一阶段:提交事务请求

事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo日志,此时事务没有提交。 (Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入数据文件)

3、第二阶段:事务执行

如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息; 参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。

4、2PC 主要缺点

  1. 同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
  2. 单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。
  3. 数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送 commit 请求过程中,网络异常或者协调者发生了故障,导致只有一部分参与者接受到了 commit 请求。于是整个分布式系统便出现了数据不一致的现象。
  4. 参与者故障时,协调者只能靠超时操作中断事务,容错性差,一个节点失败,整个事务就失败了。

三、3PC 协议

三段提交(3PC)是对两段提交(2PC)的一种升级优化,主要是为了解决两阶段提交协议的阻塞问题,2PC 存在的问题是当协作者崩溃时,参与者不能做出最后的选择。因此参与者可能在协作者恢复之前保持阻塞。三阶段提交(Three-phase commit),是二阶段提交(2PC)的改进版本。

1、改动点

与两阶段提交不同的是,三阶段提交有两个改动点。

  1. 把二段提交的第一个段分成了两段:询问,然后再锁资源,在询问的时候并不锁定资源,除非所有人都同意了,才开始锁资源。保证了在最后提交阶段之前,各参与者节点的状态都一致。
  2. 在参与者中也引入超时机制。 当参与者各种原因未收到协调者的 commit 请求后,会对本地事务进行 commit,不会一直阻塞等待,解决了 2PC 的单点故障问题。

但 3PC 还是没能从根本上解决数据一致性的问题。3PC 的三个阶段分别是 CanCommit、PreCommit、DoCommit。

image-20230103163033319

2、第一阶段:CanCommit

  1. 协调者进行事务询问,协调者向所有的参与者发送一个包含事务内容的 CanCommit 请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 参与者向协调者反馈事务询问,参与者在接收到来自协调者的包含了事务内容的 CanCommit 请求后,正常情况下,如果自身认为可以顺利执行事务,则反馈 Yes 响应,并进入预备状态,否则反馈 No 响应。

3、第二阶段:PreCommit

协调者在得到所有参与者的响应之后,参与者在 CanCommit 反馈的是 Yes,执行事务预提交:

  1. 协调者发送预提交请求(发出 preCommit 请求,并进入 prepared 阶段)
  2. 参与者进行事务预提交(参与者接收到 preCommit 请求后,会执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中。)
  3. 各参与者向协调者反馈事务执行的结果(若参与者成功执行了事务操作,那么反馈 Ack)

协调者在得到所有参与者的响应之后,参与者在 CanCommit 反馈的是 No**,**中断事务:

  1. 协调者发送中断请求:(协调者向所有参与者发出 abort 请求。)
  2. 中断事务(无论是收到来自协调者的 abort 请求或者等待协调者请求过程中超时,参与者都会中断事务)

4、第三阶段:DoCommit

DoCommit阶段完成真正的事务提交或者完成事务回滚。

在第二阶段 PreCommit 阶段收到ACK确认消息,则完成事务提交:

  1. 协调者发送提交 DoCommit 请求(协调者将从预提交状态转化为提交状态,并向所有的参与者发送 DoCommit 请求)
  2. 参与者进行事务提交(参与者接收到 DoCommit 请求后,会正式执行事务提交操作,并在完成提交之后释放整个事务执行过程中占用的事务资源。)
  3. 各参与者向协调者反馈事务提交的结果(若参与者成功完成事务提交,那么反馈 Ack 响应)
  4. 完成事务(协调者接收到所有参与者反馈的 Ack 消息后,完成事务。)

在第二阶段PreCommit阶段超时中断没有收到 ACK 确认消息,则完成事务中断:

  1. 协调者发送中断请求(协调者向所有的参与者节点发送 abort 请求)
  2. 参与者进行事务回滚(根据记录的 Undo 信息来执行事务回滚,并在完成回滚之后释放整个事务执行期间占用的资源)
  3. 各参与者向协调者反馈事务回滚的结果(参与者在完成事务回滚后,向协调者发送 Ack 消息。)
  4. 中断事务(协调者接收到所有参与者反馈的 Ack 消息后,中断事务。)

注意:在 DoCommit 阶段可能出现协调者宕机、协调者与参与者出现网络故障;导致参与者接收不到协调者的 DoCommit 请求或 Abort 请求, 参与者会在请求超时后,继续进行事务提交。

5、3PC 的优缺点

优点:相对于 2PC,3PC 主要解决的单点故障问题,并减少阻塞,因为一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit(因为理论上来说,如果第一阶段所有的结点返回成功,那么有理由相信成功提交的概率很大)。而不会一直持有事务资源并处于阻塞状态。

缺点:但是这种机制也会导致数据一致性问题,因为,由于网络原因,协调者发送的中断响应没有及时被参与者接收到,那么参与者在等待超时之后执行了 commit 操作。这样就和其他接到 abort 命令并执行回滚的参与者之间存在数据不一致的情况。

总结:

  • 相比较 2PC 而言,3PC 对于协调者和参与者都设置了超时时间,而 2PC 只有协调者才拥有超时机制。这解决了一个什么问题呢?这个优化点主要是避免了参与者在长时间无法与协调者通讯的情况下(协调者挂掉了),无法释放资源阻塞的问题。

  • 但是相应的,正因为引入了参与者的超时机制,也导致了 3PC 协议在第二三阶段很容易出现数据不一致的问题。

简单来说 2PC 是一个数据强一致性协议,而 3PC 通过弱化数据的一致性来解决阻塞的问题。

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

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

相关文章

(1分钟)速通ikdtree

Ikdtree算法来自fast-lio2 其中i是incremental的缩写,表示增量的kdtree。 ​ Ikdtree算法来自fast-lio2 其中i是incremental的缩写,表示增量的kdtree。 ​ Ikdtree算法来自fast-lio2 其中i是incremental的缩写,表示增量的kdtree。 ​ 编辑…

性能成本难两全?OpenMLDB 实时计算双存储引擎让你不必纠结(附测评报告)

内存和磁盘的双存储引擎架构 1.1 使用场景描述 OpenMLDB 的线上服务部分为了满足不同的性能和成本需求,提供了两种分别基于内存和磁盘的存储引擎。关于这两种存储引擎的使用考量,和推荐匹配场景,见如下表。 [外链图片转存失败,源站可能有防…

使用ES Term query查询时一定要注意的地方

文章目录一、Term query简介二、Term query和Match query对比1. 数据准备2. 使用Match query查询3. 使用Term query查询三、分词器修改字段值的场景1. 删除大多数标点符号2. 英文大写转小写3. 超过max_token_length部分单独拆分一、Term query简介 使用Term query可以根据精确…

【计算机模型机设计】8指令多周期(硬布线)MIPS CPU设计报告

2023年第一篇文章来咯~ 8指令多周期(硬布线)MIPS CPU设计报告一、设计概述(基本类似于上一篇)1.1设计目的1.2设计任务1.3设计要求1.4技术指标二、总体方案设计2.1主要功能部件2.2数据通路设计三、详细设计与实现3.1主要功能部件的…

Cookie 和 Session、实现用户登录逻辑

Cookie 和 Session一、回忆 Cookie二、理解会话机制 (Session)三、Cookie 和 Session 的区别四、核心方法4.1 HttpServletRequest 类中的相关方法4.2 HttpServletResponse 类中的相关方法4.3 HttpSession 类中的相关方法4.4 Cookie 类中的相关方法五、代码示例: 实现用户登陆5.…

转速传感器信号隔离变送模块PCB焊接方波信号输出

特点 转速传感器信号直接输入,方波信号输出正弦波、锯齿波信号输入,方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率,响应速度快电源、信号:输入/输出 3000VDC三隔离辅助电源:5V、12V、15V或24V直流单电源…

【学Vue就像玩一样】什么是计算属性?什么使监视属性?

目录 1.计算属性 2.监视属性 2.1监视属性 2.2深度监视 3.computed和watch的区别 本栏会细致的将Vue划分为两大模块,基础篇,进阶篇。想要顺利通关vue篇首先要拥有三剑客,当然node ajax法宝也会辅佐你通关的,在学习的途中如果遇…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的自动驾驶算法模型

给我推荐20个比较流行的自动驾驶算法模型 当前比较流行的自动驾驶模型有: 卷积神经网络(CNN) 长短时记忆网络(LSTM) 自适应调和滤波器(ADF) 自适应估计滤波器(AEF) 线性…

Vue组件及组件之间的通信

目录 一、Vue脚手架的使用 1、通过命令行使用vue-cli的指令创建:vue init webpack 项目名称 2、使用webStorm软件:本质仍然使用vue脚手架 3、使用vue ui创建:vue提供的图形化的操作界面 二、Vue的组件和组件之间的通信 1、组件&#xff…

使用线性回归、LGBM对二手车价格进行预测

使用线性回归、LGBM对二手车价格进行预测 目录使用线性回归、LGBM对二手车价格进行预测说明数据导入、查看和清洗数据说明导入训练集导入测试集合并数据查看数据整体情况处理数据检查并处理缺失变量EDA年份和价格地区和价格前任里程和价格燃料类型和价格传动装置类型Mileage与价…

数据库 SQL 高级用法

目录 一、INSERT INTO SELECT 用法 二、逻辑控制语句 三、公式表表达式 四、存储程序 五、触发器 一、INSERT INTO SELECT 用法 INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 1、从一个表中复制所有的列插入到另一个已存在的表…

React(coderwhy)- 01

React的介绍(技术角度) React是什么?React:用于构建用户界面的 JavaScript 库React的官网文档:https://zh-hans.reactjs.org/React的特点: 声明式编程组件化开发多平台适配Hello React react需要3个依赖&am…

【数字图像处理】骨骼锐化

源码链接:skeleton.cpp 一、实验要求 附件是人体骨骼核扫描图像,我们的目的是通过图像锐化突出骨骼的更多细节来增强图像。图像灰度的动态范围很窄并且有很高的噪声内容。 二、实验内容 按照课本冈萨雷斯的《数字图像处理》上面的思路,整…

【代码题】五道链表面试题

目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中倒数第k个结点 5.合并两个有序链表 1.移除链表元素 点击进入该题 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回新的头节点 。 思路&am…

CTF-AWD入门手册

引文 AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验,将真实网络安全防护设备设施加入抽象的网络环境中,模拟政府、企业、院校等单位的典型网络结构和配置,开展的一种人人对抗的竞赛方式,…

语言和文法的形式定义---编译原理

文法的构建问题 * 参考已有的模型 最经典的即是算数表达式的模型,其有多个算术运算符号和优先级别。 文法与正则表达式与有穷自动机的转换 显然是3型文法,也就是正则文法才有相应的性质,因为只有3型文法才是右部至多仅有两个符 号&#xf…

【Vue路由】props配置、replace属性、编程式路由导航、缓存路由组件

文章目录props配置props值为对象props值为布尔值props值为函数总结\<router-link>的replace属性总结编程式路由导航案例实现总结缓存路由组件案例实现总结props配置 我们可以看看我们原来如何使用传递过来的参数的&#xff1a; 我们要写一大长串去从$route身上拿到我们…

传统目标跟踪——光流法

目录 一、光流法 二、LK光流法 2.1 实现原理 2.2 API 三、代码 四、总结 一、光流法 光流&#xff1a;空间运动物体在观察成像平面上像素运动的瞬时速度。 光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧之间存在的对应关系&#xff0c;…

密码学_RSA

RSA是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是非…

dom截图的几种实现方式

前端要实现dom截图的功能&#xff0c;现在比较常用的是使用以下两个库 dom-to-image 使用svg技术实现html2canvas 使用canvas技术实现 如果想自己写一个dom截图的可以参考 dom-pointer 代码比较简单&#xff0c;非常适合拿来研究rasterizeHTML.js 目前rasterizeHTML.js已经被…