事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性。
A是Atomicity,原子性。一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操作成功,而另外一部分操作没有成功。如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态。比如银行的转账服务,这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化。而不会出现其他情况。
C是Consistency,一致性。一致性是指事务发生前和发生以后,都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整性。这种约束关系可以是数据库内部的约束,比如数据库元素的值必须在一定的范围内,也可以是应用带来的约束,比如转账以后银行账户的余额不能为负数。
I是Isolation,隔离性。一个事务的操作在未提交以前,是不会被并行发生的其他事务访问到的。也就是说,数据库操作不会看到某个事务的中间操作结果,比如转账过程中,用户是不能查询到一个账户余额减少了,而另外一个账户余额未发生变化的情况。
D是Durability,持久性。事务完成以后,它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其他故障的情况下,这种影响也会得到保持。
实现分布式事务的关键就是两阶段提交协议。
在两阶段提交协议中,包含了两种角色:协调者与参与者。参与者就是实际处理事务的机器,而协调者就是其中一台单独的处理分布式事务的机器。
在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。此协议中的五个步骤如下:
•应用程序调用事务协调器中的提交方法。
•事务协调器将联络事务中涉及的每个资源管理器,并通知它们准备提交事务(这是第一阶段的开始)。
•为了以肯定的方式响应准备阶段,资源管理器必须将自己置于以下状态:确保能在被要求提交事务时提交事务,或在被要求回滚事务时回滚事务。大多数资源管理器会 将包含其计划更改的日记文件(或等效文件)写入持久存储区中。如果资源管理器无法准备事务,它会以一个否定响应来回应事务协调器。
•事务协调器收集来自资源管理器的所有响应。
•在第二阶段,事务协调器将事务的结果通知给每个资源管理器。如果任一资源管理器做出否定响应,则事务协调器会将一个回滚命令发送给事务中涉及的所有资源管理 器。如果资源管理器都做出肯定响应,则事务协调器会指示所有的资源管理器提交事务。一旦通知资源管理器提交,此后的事务就不能失败了。通过以肯定的方式响应第一阶段,每个资源管理器均已确保,如果以后通知它提交事务,则事务不会失败。
图 1 事务提交
图 2 事务被回滚
看一个典型的分布式事务场景。
业务场景描述: 用户购买商品,使用支付宝余额支付:
将提交分成两阶段进行的目的很明确,就是尽可能晚地提交事务,让事务在提交前尽可能地完成所有能完成的工作,这样,最后的提交阶段将是一个耗时极短的微小操作,这种操作在一个分布式系统中失败的概率是非常小的,也就是所谓的“网络通讯危险期”非常的短暂,这是两阶段提交确保分布式事务原子性的关键所在。
从两阶段提交的工作方式来看,很显然,在提交事务的过程中需要在多个节点之间进行协调,而各节点对锁资源的释放必须等到事务最终提交时,这样,比起一阶段提交,两阶段提交在执行同样的事务时会消耗更多时间。事务执行时间的延长意味着锁资源发生冲突的概率增加,当事务的并发量达到一定数量的时候,就会出现大量事务积压甚至出现死锁,系统性能就会严重下滑。这就是使用XA事务
网络通讯危险期:
由于网络通讯故障随时可能发生,任何发出请求后等待回应的程序都会有失去联系的危险。这种危险发生在发出请求之后,服务器返回应答之前,如果在这个期间网 络通讯发生故障,发出请求一方无法收到回应,于是无法判断服务器是否已经成功地处理请求,因为收不到回应可能是请求没有成功地发送到服务器,也可能是服务 器处理完成后的回应无法传回请求方。这段时间称为网络通讯的危险期(In-doubt Time)。很显然,网络通讯的危险期是分布式系统除单点可靠性之外需要考虑的另一个可靠性问题。
两阶段提交协议最大的劣势是其通过阻塞完成的协议,在节点等待消息的时候处于阻塞状态,节点中其他进程则需要等待阻塞进程释放资源才能使用。如果协调器发生了故障,那么参与者将无法完成事务则一直等待下去。
以下情况可能会导致节点发生永久阻塞:
如果参与者发送同意提交消息给协调者,进程将阻塞直至收到协调器的提交或回滚的消息。如果协调器发生永久故障,参与者将一直等待,这里可以采用备份的协调器,所有参与者将回复发给备份协调器,由它承担协调器的功能。
如果协调器发送“请求提交”消息给参与者,它将被阻塞直到所有参与者回复了,如果某个参与者发生永久故障,那么协调器也不会一直阻塞,因为协调器在某一时间内还未收到某参与者的消息,那么它将通知其他参与者回滚事务。
同时两阶段提交协议没有容错机制,一个节点发生故障整个事务都要回滚,代价比较大。
基于此,后来有人提出了三阶段提交协议,在其中引入超时的机制,将阶段1分解为两个阶段:在超时发生以前,系统处于不确定阶段;在超时发生以后,系统则转入确定阶段。
- 大小: 6.2 KB
- 大小: 6.1 KB
- 大小: 63.2 KB
- 大小: 83.5 KB
分享到:
相关推荐
两阶段提交协议(2PC)就是为了实现这种原子性而设计的。它主要分为两个阶段: 1. 准备阶段(Prepare Phase): 在这个阶段,事务协调者(通常是事务发起者)询问所有参与者(每个涉及事务的节点)是否准备执行...
传统的两阶段提交协议(2PC)将事务处理分为两个阶段:预提交阶段和决策阶段。在预提交阶段,事务协调者询问所有参与者是否准备好提交事务,每个参与者基于自身条件作出响应。一旦所有参与者都同意提交,协调者将...
标题《基于非阻塞的分布式事务提交协议的实现》和描述提到了关于分布式事务提交协议的最新研究和实现,具体内容中介绍了两阶段提交(2PC)和三阶段提交(3PC)协议的缺点,并提出了一种新的基于非阻塞的两阶段提交协议...
两段提交(2PC)协议是实现分布式事务中一致性的一种常用协议,其分为两个阶段:第一阶段是“准备”阶段,协调者询问所有参与者是否准备好提交事务,参与者根据自身状态进行响应。第二阶段是“提交”或“中止”阶段...
两阶段提交协议(2PC)是一种经典的分布式事务协议,其设计目的是在多个数据库系统之间同步事务,以保证事务的原子性和一致性。2PC协议的核心在于它将事务提交过程分为两个阶段:预提交阶段和提交阶段。在预提交阶段...
由于短事务的这些特点,传统的两阶段提交协议不适合直接应用于短事务系统。因此,研究者通过创新设计了一种适合短事务特点的提交协议,既保留了传统协议的可靠性,同时克服了它们在短事务场景下的不足,提高了系统的...
1. XA协议:MySQL遵循XA分布式事务协议,这是一个两阶段提交(2PC)的扩展,分为准备阶段和提交阶段。但在高并发场景下,2PC可能导致阻塞和数据不一致。 2. InnoDB存储引擎:提供了对分布式事务的支持,通过事务...
常见的分布式事务解决方案主要包括基于XA协议的两阶段提交(2PC)和消息事务+最终一致性两种方式。 ##### 1. 基于XA协议的两阶段提交 两阶段提交是一种经典且成熟的分布式事务处理方案。它分为准备阶段和提交阶段...
1. **两阶段提交(2PC, Two-Phase Commit)**:这是最基础的分布式事务协议,包括准备阶段和提交阶段。在准备阶段,事务协调者询问所有参与者是否可以提交,参与者根据自身情况返回结果;在提交阶段,协调者根据准备...
为了解决这个问题,支付宝采用了两阶段提交协议(2PC)作为基础。2PC包括“准备”和“提交”两个阶段。在准备阶段,协调者询问所有参与者是否准备完成事务,参与者则进行所有必要的检查并持久化数据。如果所有参与者...
总结来说,大规模SOA系统中的分布式事务处理是系统设计和实施的重要组成部分,涉及到一系列复杂的概念和技术,如ACID特性、两阶段提交协议、补偿事务和最终一致性模型。开发者需要深入理解这些原理,并结合具体场景...
这通常通过两阶段提交协议(2PC)、三阶段提交协议(3PC)或其他一致性协议来实现。 2. **通信故障**:分布式系统中可能发生网络分区或节点故障,这些问题会导致事务无法正常完成。因此,分布式事务协议需要具备容错...
1. **两阶段提交(2PC)** - **准备阶段**:协调者向参与者发送“准备”消息,询问是否可以提交事务。 - **提交或回滚阶段**:根据所有参与者的反馈决定是提交还是回滚整个事务。 2. **三阶段提交(3PC)** - 在...
- **两阶段提交(2PC)**:是最基本的分布式事务协议,分为准备阶段和提交阶段。但由于其阻塞问题和单点故障,实际应用中限制较多。 - **三阶段提交(3PC)**:在2PC基础上增加了预提交阶段,一定程度上解决了2PC的...
在实践中,分布式事务的处理需要事务管理器来协调各个本地事务,确保要么全部成功要么全部回滚,这是通过两阶段提交(2PC)、三阶段提交(3PC)等协议实现的。除此之外,也有基于消息队列、补偿事务(TCC)等不同...
本文将深入探讨这一主题,基于程立的资料,主要关注分布式事务处理模型、XA规范以及两阶段提交和三阶段提交协议。 首先,我们需要理解什么是分布式事务。在传统的单体应用中,事务管理相对简单,但在SOA架构下,...
分布式事务的解决方案通常基于最终一致性,比如两阶段提交(2PC)和三阶段提交(3PC)协议。这些协议在处理分布式事务时,能够保证系统在面临网络分区或节点故障时仍然能按照预定的方式处理事务。 在分布式事务的控制...
7. **分布式事务原理**: 分布式事务通常采用两阶段提交(2PC)、三阶段提交(3PC)或者更高级的补偿事务(Saga)等算法来协调跨多个节点的事务。Atomikos通过JTA接口实现了这些机制,使得应用程序无需关心底层实现,...