事务与两阶段提交

聊聊 MySQL 事务二阶段提交 二阶段提交是一种用于保证分布式事务原子性的协议。二阶段提交的实现过程,有2个角色参与其中资源管理器,ResourceManager,负责管理一部分资源。对于数据库来说,这里的资源指的就是数据。如果把分布式事务看成是一个整体,每个资源管理器会负责其中的一部分,也就是分布式事务的一个本地事务。资源管理器在分布式事务中的角色就是干活的,所以,我们可以称它为执行器。事务管理器,TransactionManager,负责管理分布式事务,协调事务的提交、回滚、以及崩溃恢复。httpshttps。... 阅读详情

事务

事务是保证数据库从一个一致性的状态永久性地变成另一个一致性状态的根基

ACID

ACID是事务基本特性:
A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,不能出现部分操作成功,而另外一部分操作失败情形,基于此原则,如果事务在执行的中发生异常,那么数据库将回滚到事务发生之前的状态。
C是Consistency,一致性。一致性是指事务发生前和发生后,都不会破坏原有的约束关系,保证了数据库元素的正确性、有效性和完整性,其中的约束关系可以是数据库内部的约束,比如数据库元素的值必须在一定的范围内,也可以是应用带来的约束,比如银行账户的余额不能为负数。
I是Isolation,隔离性。一个事务的操作在提交之前,是不会被并行发生的其他事务访问到的,也就是说,数据库操作不会看到某个事务的中间操作结果,比如转账过程中,用户是不能查询到一个账户余额减少了,而另外一个账户余额未发生变化的情况。
D是Durability,持久性。事务完成以后,它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其他故障的情况下,这种影响也会得到保持。

两阶段提交

两阶段提交机制是分布式事务实现的关键,在分布式系统中,事务往往包含有多个参与者,单个参与者上的事务能够保证自身的ACID,而多个参与者之间的事务ACID则需要两阶段提交机制来保证,许多分布式关系型数据管理系统采用此机制来完成分布式事务。

两阶段提交机制依赖两阶段提交协议(two phase commit protocol,2PC),两阶段提交协议通过协调事务的参与者,决定提交或取消(回滚)事务,它能够解决很多的临时性系统故障(包括进程、网络节点、通信等故障)问题,被广泛地使用,它解决临时性系统故障是通过使用日志来记录协议的状态,从而使节点在故障恢复后可以继续进行交易。两阶段提交协议并不能够解决所有的故障,在某些情况下它还需要人为的参与才能解决问题。

在两阶段提交协议中,系统一般包含两类节点:一类为协调者,通常一个系统中只有一个;另一类为事务参与者,一般包含多个,协议中假设每个节点都会记录写前日志(write-ahead log)并持久性存储,这样,即使节点发生故障日志也不会丢失,协议中也假设节点不会发生永久性故障而且任意两个节点都可以互相通信。


两阶段提交,顾名思义,由两个阶段组成:

阶段1:请求阶段(commit-request phase,或称表决阶段,voting phase)

在这个阶段,协调者在自身节点的日志中写入一条的日志记录,然后所有参与者发送消息prepare T,询问这些参与者是否能够提交这个事务;
参与者在接受到这个prepare T 消息以后,会根据自身的情况,进行事务的预处理,
如果参与者能够提交该事务,则会将日志写入磁盘,并返回给协调者一个ready T信息,同时自身进入预提交状态状态;

如果不能提交该事务,则记录日志,并返回一个not commit T信息给协调者,同时撤销在自身上所做的数据库改;

参与者可以推迟发送响应的时间,但最终还是需要发送的。


阶段2:提交阶段(commit phase)

在这个阶段,协调者会收集所有参与者的意见,
如果收到有参与者发来not commit T信息,则标识着该事务不能提交,协调者会将Abort T 记录到日志中,并向所有参与者发送一个Abort T 信息,让所有参与者撤销在自身上所有的预操作;
如果协调者收到所有参与者发来ready T信息,那么协调者会将Commit T日志写入磁盘,并向所有参与者发送一个Commit T信息,提交该事务。
若协调者迟迟未收到某个参与者发来的信息,则认为该参与者发送了一个VOTE_ABORT信息,从而取消该事务的执行。
如果参与者接收到协调者发来的Abort T信息以后,将Abort T 记录到日志中,会终止提交;
如果参与者收到的是Commit T信息,则写入记录,将事务进行提交。


两阶段提交机制图示:



一般情况下,两阶段提交机制都能较好的运行,当在事务进行过程中,有参与者宕机时,他重启以后,可以通过询问其他参与者或者协调者,从而知道这个事务到底提交了没有,当然,这一切的前提都是各个参与者在进行每一步操作时,都会事先写入日志。
两阶段提交存在的不能解决的困境:当协调者在发出commit T消息后宕机了,而唯一收到这条命令的一个参与者也宕机了,这个时候这个事务就处于一个未知的状态,没有人知道这个事务到底是提交了还是未提交,从而需要数据库管理员的介入,防止数据库进入一个不一致的状态。
当然,如果基于前面的假设即所有节点或者网络的异常最终都会恢复,那么这个问题就不存在了,协调者和参与者最终会重启,其他节点也最终也会收到commit T的信息,这就是基于日志完成的最终一致性。


缺陷

两阶段提交协议最大的劣势是其依赖“阻塞”完成,在节点等待消息的时候处于阻塞状态,节点中其他进程则需要等待阻塞进程释放资源才能使用。另外,两阶段提交协议没有容错机制,一个节点发生故障整个事务都要回滚,代价比较大,这需要我们通过其它手段来完成容错。


一个例子

一个例子来说明两阶段提交协议的工作过程:
A组织B、C和D三个人去爬长城,如果所有人都同意去爬长城,那么活动将举行,如果有一人不同意去爬长城,那么活动将取消。
用2PC算法解决该问题的过程如下:
角色划分:A是活动的协调者,B、C和D是活动的参与者。

阶段1:
A发邮件给B、C和D,提出下周三去爬山,问是否同意。此时A需要等待B、C和D的回复邮件。
B、C收到邮件后发现自己在当日没有活动安排,则发邮件告诉A他们同意下周三去爬长城。由于某种原因,D白天没有查看邮件,此时A、B和C均需要等待。到晚上的时候,D发现了A的邮件,然后查看日程安排,发现周三当天已经有别的安排,那么D回复A说我去不了,至此第一阶段的回复完成。

阶段2:
此时A收到了所有活动参与者的邮件,如果A发现三人都同意,则发下一封邮件通知三人说,活动确定了,下周三去爬山,事务完成,结束。
可是A发现D下周三不能去爬山,那么A将发邮件通知B、C和D,下周三爬长城活动取消,

此时B、C回复A“太可惜了”,D回复A“不好意思”,至此该事务回滚,结束。


上面的例子中,A一共经历了两次发送邮件并接受全部回复的过程,这就是两阶段提交名字的由来。

通过该例子可以发现,2PC协议存在的缺陷。假如D不回复邮件,那么A、B和C将不得不处于等待的状态。并且B和C所持有的资源,即下周三不能安排其它活动,一直不能释放,其它等待该资源释放的活动也将不得不处于等待状态。

鉴于此问题,后来引入超时的机制,在超时发生以前,系统处于不确定阶段;在超时发生以后,系统则转入确定阶段。

两阶段提交协议包含协调者和参与者,且二者都有发生问题的可能性。

假如协调者发生问题,我们可以选出另一个协调者来提交事务,例如,班长组织活动,如果班长生病了,我们可以请副班长来组织,这样协调者出问题,那么事务将不会取消或超时,如果班级活动希望每个人都能去,假如有一位同学不能去了,那么直接取消活动即可,或者,如果大多数人去的话那么活动如期举行(2PC变种),

为了能够更好地解决实际的问题,2PC协议存在很多的变种,例如:树形2PC协议(或称递归2PC协议)、动态2阶段提交协议(D2PC)等。


参考:

http://www.blogjava.net/freeman1984/archive/2011/10/09/360269.html

http://blog.youkuaiyun.com/shenlan211314/article/details/7283948

【分布式事务两阶段提交】 在分布式系统中,保证数据的一致性是一个重要挑战,两阶段提交(Two - Phase Commit,2PC)是一种经典的用于解决分布式事务一致性问题的协议。下面将从概念、工作流程、优缺点和 PHP 示例等方面详细讲解两阶段提交。 阅读详情

相关推荐

讲解一下分布式事务-两阶段提交的实现原理

Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,提供了AT、TCC、SAGA和XA四种事务模式。其中,AT(Auto Transaction)模式是基于两阶段提交协议改进而来,通过数据源代理和全局锁机制实现了对业务代码几乎零侵入的分布式事务支持。随着微服务架构和分布式系统的普及,一个业务操作往往需要调用多个服务,修改多个数据源的数据。情况2:任一参与者返回"中止"或超时。情况1:所有参与者都返回"同意"

wjianwei666的专栏 1101

GaussDB数据库事务管理

事务管理是数据库系统中至关重要的一部分,它确保了数据库的一致性和可靠性。在GaussDB数据库中,事务管理不仅遵循传统的ACID特性,还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。

Gauss松鼠会 2728

MySQL进阶【十一】—— Innodb 事务的两阶段提交

两阶段提交

shehuinidaye的博客 1715

数据处理提交的“绝对”原则——事务

作者:坚定的守猴 撰写日期:2019年7月6日 开发软件和关键技术:VS;事务开启 在项目需要同时处理多条数据进行提交的时候,为了避免当中出现数据异常能够正常保存到数据库。对此我们就采用进行“”事务“的提交方法。 事务,它的数据处理原则有一种绝对的性质,对于处理之后的结果,要么成功,要么失败。数据处理成功之后,它在最后一步操作就能把这些数据完整的保存到数据库;如果失败,它就出现“回滚”,直接返回...

weixin_44541267的博客 2488

分布式事务-两阶段提交

分布式两阶段提交(Two-Phase Commit,2PC)是分布式系统中常用的一种原子提交协议,用于保证在分布式事务中所有参与者要么全部提交事务,要么全部回滚事务,以维护数据的一致性。

技术博客 1500

MySQL 事务两阶段提交原理简析

因此,事务无法回滚的关键点是事务的提交,而不是单纯的 redo log 或 binlog 的写入。其中,由于 binlog 与存储引擎是独立单元,可以将 binlog 也看作一个存储引擎,因此需要通过 XA 事务实现 binlog 与存储引擎的数据一致性和原子性,从而保证全部操作要么全部提交,要么全部回滚。首先,介绍下两阶段提交的过程,其中将 redo log 的提交拆分为两个步骤,包括 prepare 与 commit,期间写入 binlog。

wjianwei666的专栏 582

两阶段提交

一阶段提交(1PC One Phase Commit)    一 阶段提交就是事务处理器向数据库服务器发出提交请求,然后等待数据库服务器的回应,收到回应后完成事务的提交,或者服务器返回提交失败的结果就回撤事务。 危险期从发出请求开始,到收到回应结束,这段时间中数据库完成数据的修改、日志记录等处理,处理越复杂,危险期就越长。      两阶段提交(2PC Two Phase Com

风之子的专栏 3806

【Elasticsearch】使用两阶段提交在 Elasticsearch 中模拟事务功能

0.概述 翻译:使用两阶段提交在 Elasticsearch 中模拟事务功能 1.介绍 Elasticsearch 支持单个文档级别的原子创建、更新和删除操作,但不内置对多文档事务的支持。尽管 Elasticsearch 并未将自己定位为存储数据的记录系统,但在某些情况下,可能需要将多个文档修改为一个单一的内聚单元。因此,在这篇博文中,我们提出了一个两阶段提交协议,可用于模拟多文档事务。 2.概述 Elasticsearch 中的创建、更新和删除操作在文档级别是原子的,这意味着创建、修改或删除单个文档要么完

九师兄 3735

事务原则

原子性(Atomicity) 要么都成功,要么都失败。 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务前后数据的完整性必须保持一致。 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 持久性(Durability) 事务一旦被提交则不可逆,被提交到数据库中。 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,

sinat_33940108的博客 562

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 550

SAP成本控制范围配置全流程:从货币参数到标准层次(附2024最新SPRO路径)

本文详细拆解了SAP成本控制范围(Controlling Area)的完整配置流程,涵盖从货币与估价参数文件定义、参数文件分配到控制范围,再到成本中心标准层次创建等核心步骤。文章提供了2024年最新的SPRO导航路径和实战配置要点,帮助顾问构建稳健、可扩展的管理会计基础架构,并附有常见问题排查指南。

java5的博客 940

事务的两阶段提交

两阶段提交是以 binlog 写成功为事务提交成功的标识,因为 binlog 写成功了,就意味着能在 binlog 中查找到与 redo log 相同的 XID。

m0_60006388的博客 1968

西门子WinCC VBS脚本实战:5分钟搞定变量记录导出到Excel(附完整代码)

本文提供了一套高效的西门子WinCC VBS脚本方案,帮助工程师在5分钟内将变量记录数据导出至Excel。方案详细解析了时区转换、数据库连接、SQL查询优化等核心难点,并附带了完整、可直接使用的VBS代码,解决了工业自动化项目中数据导出的实际痛点。

moss5的博客 609

分布式事务两阶段提交

分布式两阶段提交

左直拳的马桶_日用桶 3862

Python爬虫(一)京东商品价格及详情页抓取

这是一个以http://item.jd.com/2957726.html为例的单网页抓取案例 import urllib.request; #载入urllib.request,用于获取页面html源代码 from pandas import Series; #载入series包 from pandas import DataFrame; #载入dataframe包 from bs4 impo

Data Proc 1万+

伺服电机开发实战指南

伺服电机作为工业自动化的核心部件,正经历前所未有的技术革新。本文从基础原理出发,详细介绍了伺服电机的分类、工作原理和特性,分析了伺服电机系统组成与核心部件,探讨了企业级开发技术,包括控制算法、通信协议和故障诊断等高级功能,并提供了实战案例分析,从行业应用到具体开发步骤,展示了伺服电机的工程实现。通过深入理解伺服电机的原理、掌握开发技术、学习应用案例,可以实现伺服系统的高性能开发与应用。

全栈 1681

【分布式事务-01】分布式事务之2pc两阶段提交

分布式事务之2pc两阶段提交

zhenghuishengq的博客 1870

多准则决策方法体系(AHP、熵权法、随机森林、加权线性法、TOPSIS、模糊综合评价)

多准则决策方法体系的基础,是由三大赋权方法和三大评价框架构成的 “3+3” 核心模块。赋权方法聚焦于准则重要性的量化,评价框架则专注于多准则信息的综合集成,二者共同覆盖了从 “确定权重” 到 “输出结果” 的全流程决策需求。

```On Earth, Be Water, By Coding``` 522

mysql事务怎么实现的,什么是两阶段提交

mysql事务怎么实现的,什么是两阶段提交 我们都知道使用mysql的事务,准确来说是innoDB引擎的事务,可以保证数据的一致性,原子性等。那么为什么呢? redo log innoDB里面用到了一个叫做redo log(重做日志)的东西。 当你进行数据库操作的时候,innoDB并不会直接操作磁盘数据,因为这样很慢很慢。它使用了wal的机制,所有的操作先记录在redo log。等没事干了或者re...

大头讲架构的博客 909

从底层结构开始学习FPGA(8)----Block RAM(BRAM,块RAM)

BRAM作为FPGA底层的存储资源,作用很大,比如可以RAM/ROM/FIFO。

孤独的单刀 2万+

uniapp:人脸识别功能,已测试,直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。

uniapp人脸识别功能,已测试可直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。 APP效果图:

sunluyi的博客 2226

【两阶段提交】分布式事务

两阶段提交(2PC)是一种分布式一致性协议,通过协调者和参与者协作实现事务的原子性。核心流程分为投票阶段(参与者准备事务并反馈)和提交/回滚阶段(协调者根据投票结果决定全局提交或回滚)。其优点是强一致性,但存在同步阻塞、单点故障和性能问题。Java中可通过JTA和XA协议实现,如Atomikos等事务管理器。典型应用场景需权衡一致性与可用性。

qq_45487673的博客 644

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究

本文原文连接: http://blog.youkuaiyun.com/bluishglc/article/details/7612811 ,转载请注明出处!1.XAXA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管理器(Transac

Laurence的技术博客 9万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 比尔盖茨的十句话
下一篇: Java 远程方法调用 RMI
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值