2PC,是Two-Phase Commit 的缩写,也就是二阶段提交,是在数据库领域处理事务,保证原子性的一种常用算法。通常会把二阶段提交协议认为是一种一致性协议,在处理成功的时候统一执行事务,在处理失败的时候统一进行回滚,从而来有效的保证分布式数据的一致性。
协议说明
顾名思义,二阶段提交协议就是把事务的提交过程分为俩个阶段来进行处理,执行的过程如下:
-
一、提交事务请求:
协调者对所有的参与者发送事务内容并询问是否可以提交操作,并开始等待参与者的相应。参与者节点来执行事务操作,并把Undo和Redo的信息记录在日志中,当参与者成功的执行了事务就反馈给协调者Yes,表示事务可以执行;如果参与者没有成功的执行事务,那么就会反馈给协调者No相应,表示事务不可以执行。 -
二、执行事务提交:
当协调者从所有的参与者获得的反馈都是Yes的时候,就会执行事务的提交。协调者对所有的参与者发起一个Commit请求,当参与者收到了Commit请求之后就会正式的进行事务的提交,在完成了提交之后会反馈协调者一个Ack消息,当协调者收到了所有的Ack消息后完成事务。
当协调者从所有的参与者获得的反馈包含了No,或者在等待超时之后没有获得所有的响应,就会中断事务,向所有的参与者发出rollback请求,参与者在收到了请求之后,回去查询在阶段一里记录的Undo信息来执行事务的回滚操作,并在完成回滚之后释放整个事务执行期间占用的资源,同样完成了回滚之后会反馈协调者一个Ack消息,当协调者收到了所有的Ack消息后完成事务中断。
优缺点
优点:原理简单,实现方便
缺点:同步阻塞,单点问题,数据不一致,太过保守。
缺点的前俩个都很容易理解,至于数据不一致的情况是在二阶段的commit的时候,可能有节点没有收到commit指令,于是出现了有的事务进行了提交,有的没有办法提交事务。太过保守则是任意一个节点的失败都会导致整个事务的失败。