2PC
什么是 2PC
2PC 是 Two-Phase Commit 的缩写,即二阶提交协议。它是将事务的提交过程分成两个阶段来处理的,分别是提交事务请求阶段和执行事务提交阶段;二阶提交协议常用于保证分布式系统的数据一致性。
提交事务请求阶段
1. 事务提交询问
协调者向参与者发送事务内容,并询问是否可执行事务提交操作,等待参与者的应答结果。
2. 事务执行
参与者对询问的事务内容进行操作,并将 Undo 和 Redo 的信息记录到事务日志中。
3. 各参与者给协调者反馈响应结果
反馈结果包括可以执行事务或者不可以执行事务。
二阶提交的第一阶段也可以称作“投票阶段”,即各参与者投票表明是否要继续执行事务提交操作。
执行事务提交阶段
协调者根据参与者的反馈结果决定是否可以进行事务提交操作,一般有以下两种情况:
1. 正常执行事务提交
发送事务提交请求协调者向参与者发送事务 commit 请求。
执行事务提交参与者接受到 commit 请求后,正式执行事务,并在事务执行完成之后释放资源。
反馈事务提交执行结果参与者完成事务提交后,向协调者发送 ack 消息。
完成事务 协调者接收到所有参与者的 ack 消息后事务完成。
2. 中断事务
发送事务回滚请求协调者向所有参与者发出 rollback 请求。
执行事务回滚参与者接受到 rollback 请求后,利用第一阶段记录的 Undo 信息执行事务回滚操,然后释放资源。
反馈事务回滚结果参与者向协调者发送 ack 信息。
事务中断完成协调者收到所有 ack 消息后表示完成事务中断。
2PC 的优缺点
优点
简单易于理解,容易实现。
缺点
同步阻塞为什么说是同步阻塞呢?因为在执行过程各参与者在等待其他参与者时,将无法执行其他操作。
协调者单点协调者在整个二阶提交中起到了关键性作用,一旦协调者出现了问题,操作将无法执行下去。
存在数据不一致的可能性在二阶提交的第二阶段中,即执行事务提交操作时,如果出现网络异常或导致部分参与者接受到了 commit 请求,部分参与者没有接收到 commit 请求,此时就会导致数据不一致。
3PC
什么是 3PC
3PC 是 Three-Phase Commit 的缩写,即三阶提交,是对二阶提交的改进。
canCommit 阶段
preCommit 阶段
doCommit 阶段