Two-Phase Commit,二阶段提交,作为最基础的一致性协议,保证了分布式系统数据的一致性.目前绝大多数的关系型数据库都是使用2PC来完成分布式事务处理的.
利用2PC协议能够非常方便地完成所有数据库事务参与者的协调,统一决定事务的提交或回滚,从而能有效地保证分布式数据一致性.
优点
原理简单,实现方便
缺点
同步阻塞
极大的限制了系统的性能
单点问题
协调者在整个二阶段提交过程中,一旦出现故障(尤其是在阶段二),都会导致系统无法正常运行
脑裂
也就是数据不一致
在阶段二,即执行事务提交的阶段,当协调者向所有参与者发送commit请求之后,发生了局域网络异常或者是协调者在尚未发送完commit请求之前自身崩溃,导致只有部分的参与者接收到了commit请求,这部分参与者就会进行事务的提交,没有收到commit的参与者则无法进行事务的提交。于是,整个分布式系统出现数据不一致的情况。
流程:
阶段1: 提交事务请求(投票阶段):
事务询问.
协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应.
执行事务.
各参与者节点执行事务操作,并将
Undo
和Redo
信息记入事务日志.各参与者向协调者反馈事务询问的响应
如果参与者成功执行了事务操作,那么就反馈给协调者
Yes
信息,表示事务可以执行; 如果参与者没有成功执行事务就反馈给协调者No
响应,表示事务不可以执行.
这个阶段可以看成一种投票阶段,即各个参与者投票表明是否要继续执行接下去的事务提交操作.
阶段2: 执行事务提交
这个阶段,协调者会根据参与者的反馈情况来决定是否最终进行commit
.一般,包含两种可能:
#1 执行事务提交:
发送提交请求
假如协调者从所有的参与者获得的反馈都是
YES
,那么就执行提交操作,协调者向参与者发送commit
请求事务提交
参与者接受到
Commit
请求后,会正式执行事务提交操作,并在完成后释放整个事务执行期间所占用的资源反馈事务提交结果
参与者在完成事务提交之后,向协调者发送
Ack
信息完成事务
协调者收到所有参与者的
Ack
消息后,完成事务
#2 中断事务:
如果任何一个参与者返回了No
信息,或者等待超时之后,协调者尚无法接受到所有的参与者反馈信息,就会中断事务。
发送回滚请求
协调者向所有参与者发出Rollback请求
事务回滚
参与者接收到Rollback请求后,会利用其在阶段一种记录的Undo信息来执行回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。
反馈事务回滚结果
参与者在完成事务回滚之后,向协调者发送
Ack
消息中断事务
协调者收到所有参与者反馈的
Ack
消息之后,完成事务中断