事务的一阶段提交协议和二阶段提交协议

因为事务需要实现ACID,即原子性、一致性、隔离性、持久性,所以需要采用一定的机制来保证,通常采用的是分阶段提交的方式。

XA:XA协议,规定事务管理器和资源管理器接口,采用二阶段提交协议。

一阶段提交协议

一阶段提交协议相对简单,如下图:

当然,前提是开启了事务,然后在应用程序发出提交/回滚请求后,数据库执行操作,而后将成功/失败返回给应用程序,程序继续执行。

一阶段提交协议相对简单,简单带来的优点就是,它不用再与其他的对象交互,节省了判断步骤和时间,所以在性能上是在阶段提交协议中对好的。

二阶段提交协议

一阶段提交协议有其优点,但缺点也很明显:

  • 数据库确认执行事务的时间较长,出问题的可能性就随之增大。
  • 如果有多个数据源,一阶段提交协议无法协调他们之间的关系。

所以在一阶段协议的基础上,有了二阶段协议,二阶段协议的好处是添加了一个管理者角色,如下:

很明显,二阶段协议通过将两层变为三层,增加了中间的管理者角色,从而协调多个数据源之间的关系,二阶段提交协议分为两个阶段。

第一阶段

应用程序调用了事务管理器的提交方法,此后第一阶段分为两个步骤:

  • 事务管理器通知参与该事务的各个资源管理器,通知他们开始准备事务。
  • 资源管理器接收到消息后开始准备阶段,写好事务日志并执行事务,但不提交,然后将是否就绪的消息返回给事务管理器(此时已经将事务的大部分事情做完,以后的内容耗时极小)。

第二阶段

第二阶段也分为两个步骤:

  • 事务管理器在接受各个消息后,开始分析,如果有任意其一失败,则发送回滚命令,否则发送提交命令。
  • 各个资源管理器接收到命令后,执行(耗时很少),并将提交消息返回给事务管理器。

事务管理器接受消息后,事务结束,应用程序继续执行。

为什么要分两步执行?一是因为分两步,就有了事务管理器统一管理的机会;二尽可能晚地提交事务,让事务在提交前尽可能地完成所有能完成的工作,这样,最后的提交阶段将是耗时极短,耗时极短意味着操作失败的可能性也就降低。

同时,二阶段提交协议为了保证事务的一致性,不管是事务管理器还是各个资源管理器,每执行一步操作,都会记录日志,为出现故障后的恢复准备依据。

二阶段提交协议的存在的弊端是阻塞,因为事务管理器要收集各个资源管理器的响应消息,如果其中一个或多个一直不返回消息,则事务管理器一直等待,应用程序也被阻塞,甚至可能永久阻塞。

事务与协议

那么本地事务和分布式事务,分别采用的是哪些协议?我在RedBooks的一个文档中看到的是:

Global transactions

Although the XAResource interface is intended to support two phase commit, the specification does not force an adapter to support two phase commit. However, if the resource adapter does implement
XAResource it must also implement support for one phase commit. This allows the transaction manager to do one phase commit optimization (explained later) by setting the onePhase flag to true when doing acommit.……

Local transactions

A local transaction is managed by the resource manager without the need for an

external transaction manager, and can be utilized when only one resource is

involved. Local transactions only support one phase commit, because they only

reference one EIS.……

大意是:虽然实现XA接口的目的是为了支持二阶段提交协议,但是它也支持一阶段提交协议。本地事务只支持一阶段提交;分布式事务默认采用的是二阶段提交,如果在分布式事务中非得使用一阶段提交协议,那么只要数据源多余一个就会抛出异常,如果只有一个数据源则正确执行。

总结

一阶段提交协议和二阶段提交协议只是比较常用的两个,此外还有其他协议,可自行研究。

时间: 2024-07-28 14:43:51

事务的一阶段提交协议和二阶段提交协议的相关文章

网络信息中的一阶估计和二阶估计

一阶估计:用来衡量两个存在连接的结点的相似度. 结合嵌入的方法的具体应用:预测跨社交网络中的锚链接.http://xueshu.baidu.com/s?wd=paperuri:(d90c70ad50b2307df3dc1bc7cd247653)&filter=sc_long_sign&sc_ks_para=q%3DPredict+Anchor+Links+across+Social+Networks+via+an+Embedding+Approach&tn=SE_baiduxues

分布式事务解决方案(转载)

目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开源框架能够解决的,更多的还是看业务场景,根据场景来给出解决方案.根据笔者最近几年的了解,总结了几个点,更多的应用系统在编码的时候,更加关注数据的一致性,这样系统才是健壮的. 一.基础理论 目前关于事务的几大理论包括:ACID事务特性,CAP分布式理论,以及BASE等.ACID在数据库事务中体现,CA

分布式事务最终一致性常用方案

目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开源框架能够解决的,更多的还是看业务场景,根据场景来给出解决方案.根据笔者最近几年的了解,总结了几个点,更多的应用系统在编码的时候,更加关注数据的一致性,这样系统才是健壮的. 一.基础理论 目前关于事务的几大理论包括:ACID事务特性,CAP分布式理论,以及BASE等.ACID在数据库事务中体现,CA

一文讲透微服务下如何保证事务的一致性

原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 从本地事务到分布式事务的演变 什么是事务?回答这个问题之前,我们先来看一个经典的场景:支付宝等交易平台的转账.假设小明需要用支付宝给小红转账 100000 元,此时,小明帐号会少 100000 元,而小红帐号会多 100000 元.如果在转账过程中系统崩溃了,小明帐号少 100000 元,而小红帐号金额不变,就会出大问题,因此这个时候我

再说JTA和JTS

事务是编程中必不可少的一项内容,基于此,为了规范事务开发,Java增加了关于事务的规范,即JTA和JTS,在网上搜索关于JTA和JTS,发现有效内容远少于EJB,这倒不是说它们的重要性低于EJB,而是说明JTA和JTS封装的更为透明,隐藏了大部分细节,通常情况下,我们仅仅需要使用几个简单的APIs就能解决问题. JTA和JTS JTA JTA定义了一套接口,其中约定了几种主要的角色:TransactionManager.UserTransaction.Transaction.XAResource

【分布式】一致性协议

一.前言 继续前面的学习,这篇我们来学习在分布式系统中最重要的一块,一致性协议,其中就包括了大名鼎鼎的Paxos算法. 二.2PC与3PC 在分布式系统中,每一个机器节点虽然能够明确知道自己在进行事务操作过程中的结果是成功或是失败,但是却无法直接获取到其他分布式节点的操作结果,因此,当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID的特性,需要引入协调者的组件来统一调度所有分布式节点的执行逻辑,而被调度的节点则被称为参与者,协调者负责调度参与者的行为并最终决定这些参与者是否要

Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转

原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一职责.独立开发部署.功能复用和系统容错等等,也带来一些问题. 例如上手难度变大,运维变得更复杂,模块之间的依赖关系更复杂,数据一致性难以保证,等等.但是办法总是比问题多,本篇文章就来介绍一下我们是如何保障微服务架构的数据一致性的. 微服务架构的数据一

从 0 开始的微服务架构:(四)如何保障微服务架构下的数据一致性

虽然已经红了很久,但是"微服务架构"正变得越来越重要,也将继续火下去.各个公司与技术人员都在分享微服务架构的相关知识与实践经验,但我们发现,目前网上的这些相关文章中,要么上来就是很有借鉴意义的干货,要么就是以高端的专业术语来讲述何为微服务架构.就是没有一个做到成熟地将技术传播出来,同时完美地照顾"初入微服务领域人员",从 0 开始,采用通俗易懂的语言去讲解微服务架构的系列.所以,我们邀请青柳云的苏槐与 InfoQ 一起共建微服务架构专题"Re:从 0 开始

MyCat 的入门和放弃

1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybill 表的 id 字段来进行分片 分片方法为 id 值取 3 的模,根据模值确定在DB1,DB2,DB3中的某个分片 如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片.例如: select * from tt_waybill where id = 12330; 此时Mycat会计算路由结果 12330 % 3 = 0 –> DB1 并将该请求路