什么是ACID理论(二阶段、三阶段提交、TCC)

目录

  • 二阶段提交协议
  • TCC(Try-Confirm-Cancel)
    • 预留成功
    • 预留失败
  • 三阶段提交协议
  • 总结
  • Some questions
    • reference

ACID理论时对事务特性的抽象和总结,想要实现ACID需要掌握二阶段提交协议以及TCC
这里是有关协议的论文PDF链接:

CONCURRENCY CONTROLAND RECOVERY IN DATABASE
SYSTEMS

二阶段提交协议

二阶段提交协议:通过二阶段的协商来完成一个提交操作

首先定义一个分布式事务操作,发起这个事务到分布式系统种的节点中。某一个节点收到消息后扮演协调者身份,与其他节点联系,发送网络消息,发起二阶段提交。
然后协调者进入请求提交阶段(即投票阶段),其他节点进行评估,评估事务中需要操作的对象和对象状态是否准备好、是否提交新操作,然后回复协调者,
协调者收到所有回复后,进入提交执行阶段(即完成阶段)。协调者先执行事务,然后通知其他节点,其他节点接收到通知后也执行事务,然后将事务结果返回给协调者。
协调者将总结果返回给客户。

需要注意的是:
在第一阶段,每个参与者投票表决事务是放弃还是提交。一旦参与者投票要求提交事务,那么就不允许放弃事务。即:
在一个参与者投票要求提交事务之前,它必须保证能够执行提交协议中它自己的那一部分,即使参与者出现故障或者中途被替换。

不过二阶段协议也存在问题:
1、在提交请求阶段,需要预留资源,在资源预留期间,其他人不能操作(MySQL XA协议在第一阶段会将相关资源锁定)
2、数据库是独立的系统

所以无法根据业务特点弹性调整锁的粒度,会影响到数据库的并发性能。

TCC(Try-Confirm-Cancel)

TCC是预留、确认、撤销三个操作的简称,包含了预留、确认or撤销两个阶段。

预留成功

进入预留阶段,步骤如下:
在这里插入图片描述

如果预留阶段的执行都没有问题,就进入确认阶段,步骤如下:
在这里插入图片描述

预留失败

假设节点2分配资源失败了:
在这里插入图片描述
那么会进入撤销阶段:
在这里插入图片描述
TCC本质:补偿事务
它的核心思想是针对每个操作都要注册一个与其对应的确认操作和补偿操作(也可以称为撤销操作)。
它是一个业务层面的协议,TCC的三个操作需要在业务代码中编码实现。为了实现一致性,确认操作和补偿操作必须是幂等的,因为这2个操作可能会失败重试。
Tips:幂等性是指同一操作对同一系统的任意多次执行,所产生的影响均与一次执行的影响相同,不会因为多次执行而产生副作用。常见的实现方法有Token、索引等。本质是通过唯一标识,标记同一操作的方式来消除多次执行的副作用。

三阶段提交协议

三阶段提交协议,针对二阶段提交协议的痛点:协调者故障,参与者长期锁定资源,引入了询问阶段超市机制,来减少资源被长时间锁定的情况,但是会导致集群各个节点在正常运行的情况下,使用更多的消息进行协商,增加系统负载和响应延迟。所以三阶段提交协议很少使用。

总结

在这里插入图片描述

Some questions

在两阶段提交协议中,如果一个节点在第一阶段确认可以提交,但是它之后崩溃了,第二阶段无法实现自己那部分事务,此时该如何是好?
需要将提交的相关信息持久化到磁盘,然后重启,恢复到之前状态

reference

ACID理论:CAP的酸,追求一致性

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

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

相关文章

oracle安装后新建数据库实例及配置

ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法 (2011-01-20 13:50:37) 转载▼标签: it 分类: 技术早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务…

html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend

一、前言 本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏。 首先让我们来了解了解如何用html5实现动画,毕竟“动静结合”是先有动再有静。看了上一章的内容,或许你就有了…

BASE理论(基本可用策略+ 最终一致性实现)

目录实现基本可用的几个策略1、流量削峰(不同地区售票时间错峰出售)2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)3、体验降级(看到…

Paxos算法(Basic Paxos 与 Multi-Paxos思想)

目录Basic Paxos三个角色达成共识的方法对于Basic Paxos的总结Multi-Paxos领导者优化 Basic Paxos 执行referencePaxos 算法包含 2 个部分: 1、Basic Paxos : 描述多节点之间如何就某个值达成共识 2、Multi-Paxos : 描述执行多个Basic Paxos实…

vs2012下调试mvc4源代码

当前流行的应该是mvc3才对。然后在研究mvc3的源代码时候,Html这个属性下的扩展方法Partial()都没有。IntelliSense不会提示该方法,找了半天的资料也问了一些博友,没看到好的解决棒法。最后没辙另辟蹊跷,就开始着手研究mvc4的源代码…

JAVA UDP网络编程学习笔记

一、UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路…

(转)页游安全攻与防,SWF加密和隐藏密匙

原文链接:http://netsecurity.51cto.com/art/201211/364775.htm 页游,最最核心的就是客户端(swf)与服务端的游戏通信了。游戏通信产生的封包,内容是否可识别,可篡改,可重放,处理逻辑…

linux 命令案例学习——文件搜索

两个搜索文件的工具 locate ——仅仅通过文件名查找文件find ——依据文件的各种属性在既定目录(包括子目录)里查找一个通常与文件搜索命令一起使用、处理搜索结果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下结…

Redis 缓存击穿、缓存穿透、缓存雪崩的处理方法

常用的分布式缓存Redis单机并发量能达到万级,常用的关系型数据库MySQL一般并发量是千级,他们支持的并发量可能差十倍,所以要尽可能把流量拦截在缓存层。 缓存击穿 一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打…

图像处理基础

图像处理基础 在计算机中,按照颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前,大多数图像处理软件都支持这四种类型的图像。 (1) 二值图像:一幅二值图像的二维矩阵仅由0、1两个值构成&#x…

缓存一致性解决方法

对于缓存 数据库读写,有个经典的Cache Aside Pattern: 读取:先读取缓存,缓存里没有,读取数据库,然后返回响应,顺便保存缓存: 更新:先更新数据库,然后删除缓…

使用SpringMVC的表单验证

上一篇搭建了基本项目,这一篇在此基础上加入表单验证功能。 第一步,添加command类 Java代码 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

单体、分布式、微服务、Serverless软件架构一览

目录软件架构单体架构分布式应用微服务架构Serverless架构总结Reference软件架构 软件架构就是软件的基本结构,合适的架构是软件成功的最重要因素之一。这里列举了目前流行的4种软件架构。 单体架构 典型的三级架构:前端(web/手机端&#…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神图?

Midjourney在沉寂九个月后推出了Midjourney V6,这个文生图产品体现出的更细腻的细节处理,更强大的语言理解能力和更加“不像AI”的图片效果在过去几天引发一片惊呼。 作为一个闭源的模型产品,Midjourney的魔法配方并不为人所知,但…

连续内存分区式内存管理

目录前言分区式内存管理动态分区内存管理总结本笔记参考黄工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 内存管理模块主要负责内存的初始化、分配以及释放。 从分配内存是否连续可以分为两大类: 1、连续内存管理 为进程分配的内存空间是连续的&a…

用DEVC++作图

小海豚学NOIP,老师说要用DEV C。 小海豚喜欢画图,记得以前用C#编些程序给她看。可前一阵打开看,我的免费Visual Studio过期了。可恶的Microsoft ,不想用盗版难道就要每个月就下载一次? 于是就用DEV C的Windows调用吧。…

Python服务器开发三:Socket

Python服务器开发三:Socket socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件描述符。不同的是文件需要用open()函数打开,而socket用socket() 函数建立.recv()、send()函数和read()、write(…

Linux命令常见

摘自: 常考的 21 条 Linux 命令 目录)cd,切换路径ls,查看文件与目录的命令cp,用于复制文件mv,用于移动文件、目录cat,查看文件内容find,文件搜索文件权限命令, 设置权限,-取消权限文本处理命令打包和压缩文件命令进程相…

OSGi.NET 学习笔记 [模块化和插件化][小结]

【目录】-【模块化和插件化】-【小结】 现在我们来对OSGi.NET的“模块化和插件化”做一个小结,再次把官方的说明拿出来  1) 物理隔离:基于UIOSP开发的模块是一个物理隔离的可单独部署的模块,每一个模块拥有独立的文件夹、类型空…

raft算法学习(一):角色概念以及选举过程

Raft算法是强领导模型,集群中只能有一个领导。 下面是raft的视频讲解: raft raft的三种角色及其概念 服务器节点状态一共有三种:领导者(Leader)、跟随着(Follower)、候选人(Candid…