在分布式系统中,当多个节点共同参与一个事务时,需要保证事务的执行结果一致。三阶段提交协议由协调者(Coordinator)和参与者(Participant)两种角色组成。协调者负责协调整个事务的进行,而参与者则负责执行具体的操作。
三阶段提交协议(3PC)主要是为了解决两阶段提交协议的阻塞问题,2pc存在的问题是当协作者崩溃时,参与者不能做出最后的选择。因此参与者可能在协作者恢复之前保持阻塞。三阶段提交是二阶段提交(2PC)的改进版本。
与两阶段提交不同的是,三阶段提交有两个改动点:
1、协调者和参与者都引入了超时机制
2、在第一阶段和第二阶段中引入了准备阶段,把2PC的准备阶段再次一分为二(CanCommit和PreCommit)
三阶段提交协议主要分为以下三个阶段:
1、CanCommit 阶段
1.1、协调者向 参与者发送CanCommit请求。询问是否可以执行事务提交操作(比如尝试连接数据库锁资源等操作是否正常)。然后开始等待参与者的响应。
1.2、参与者接到CanCommit请求之后,如果其可以正常顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No
2、PreCommit阶段
当所有参与者在CanCommit阶段都响应YES,则协调者向所有参与者发送PreCommit请求(这里 协调者和参与者都引入了超时机制 ,2PC中只有协调者可以超时,参与者没有超时机制),参与者接受到请求后,参与者执行本地事务操作,并写入到本地的 Undo/Redo 日志,此时事务没有提交。(Undo 日志是记录修改的数据,用于数据回滚,Redo 日志是记录修改后的数据,用于提交事务后写入数据文件)将结果返回给协调者,并且记录自己的操作日志以备后续恢复。
3、DoCommit阶段
该阶段进行真正的事务提交,分为以下两种情况
3.1、执行提交
A.发送提交请求。协调者接收到参与者发的响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。
B.事务提交。参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
C.响应反馈。事务提交完之后,向协调者发送响应。
D.完成事务。协调者接收到所有参与者响应之后,完成事务。
3.2、中断事务
协调者没有接收到参与者的响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会通知各个参与者执行中断事务。