两阶段提交协议(2PC)

来源:互联网 发布:qt5.9连接mysql数据库 编辑:程序博客网 时间:2024/04/29 16:30

对于两阶段协议,只要学过《数据库基本原理》这本书的应该对这个名词比较熟悉,当时在本科的时候,学过这个协议,结果在后面却完全忘了这个协议,直到在后面《大数据存储》里面有一道关于两阶段协议的题后才引起了我对这个协议的了解。


两阶段协议分两个阶段,投票阶段和决定阶段:

(1)投票阶段

1. 协调者发送一个VOTE-REQ消息给所有的参与者
2. 当参与者接收到VOTE-REQ消息后,它会发送一个包含参与者投票结果的消息(YES或NO)给协调者作为响应。如果参与者投的是No,它会决定Abort事务并停止运行

(2)决定阶段

1. 协调者收集来自所有参与者的投票信息。如果所有的消息都是YES,同时协调者投的也是Yes,那么协调者就会决定进行Commit,并向所有参与者发送COMMIT消息。否则协调者就会决定进行Abort,并向所有投Yes的参与者发送ABORT消息(那些投No的参与者已经在第一阶段第2步中决定Abort了)。之后,对于这两种情况协调者都会停止运行
2. 每个投Yes的参与者等待来自协调者的COMMIT或ABORT消息。收到消息后执行相应动作然后停止运行。

这个协议看起来好像有点不近人情,只要有一人没有做出肯定的回复,整个动作就要被取消。

举个例子说明吧,上面的好像有点抽象:

假设一个寝室有四人:A、B、C、D,有一天室长A说明天大家一起去看电影吧。

B回复:好吧

C回复:行

但是此时D不在寝室,室长就发个短信给D,但是D一直没有看手机,直到会寝室才直到这件事,此时他却说,不好意思,我们明天有约。

室长,说那我们明天就不去吧,就这样看电影活动就被取消。


这就是两阶段协议,在分布式系统中的应用就是,只有全部的结果能通过才通过,这样的话就会保证数据的一致性。





0 0
原创粉丝点击