3PC 模型
3PC 模型指的是三阶段提交模型,是在 2PC 模型的基础上做了改进。3PC 模型把 2PC 模型中的 Prepare 阶段一分为二,最终形成 3 个阶段:CanCommit 阶段、PreCommit 阶段、DoCommit 或 DoRollback 阶段。
执行流程
先来看下 3PC 模型事务执行成功的流程:
- CanCommit 阶段:由事务管理器向各个参与全局事务的资源管理器发送 CanCommit 消息,各资源管理接受到消息后,确认资源是否可用,且能够执行事务,并返回 Yes 消息。
- PreCommit 阶段:由事务管理器向各个参与全局事务的资源管理器发送 PreCommit 消息,各资源管理接受到消息后,将事务写入本地的 Redo Log 和 Undo Log 中,并向事务管理器返回 Ack 消息,表示事务执行成功的状态,但此时不会提交事务。
- DoCommit 阶段:由事务管理器向各个参与全局事务的资源管理器发送 DoCommit 消息,各资源管理接受到消息后,将本地事务提交,并回复已提交消息,同时释放本地锁定的资源。事务管理器接收到资源管理器返回的事务已提交的消息,完成事务提交。
再来看 3PC 模型事务执行失败的流程:
- CanCommit 阶段:由事务管理器向各个参与全局事务的资源管理器发送 CanCommit 消息,各资源管理接受到消息后,确认资源是否可用,且能否执行事务,部分资源管理器返回 No 消息,表示不能执行事务。
- PreCommit 阶段:由事务管理器向各个参与全局事务的资源管理器发送 Abort 消息,资源管理接受到该消息或者期间出现网络超时,都会中断事务的执行。
- DoRollback 阶段:由事务管理器向各个参与全局事务的资源管理器发送 DoRollback 消息,资源管理器会利用 Undo Log 日志信息回滚事务,并释放执行事务时锁定的资源,向事务管理器返回已回滚的状态。事务管理器接收到资源管理器返回的事务已回滚的消息,完成事务回滚。
3PC vs 2PC
与 2PC 模型相比,3PC 模型新增 CanCommit 阶段,其作用是做一个缓冲,先进行询问,保证各个参与全局事务的资源管理器资源可用。
3PC 模型引入了参与者的超时自动提交机制来解决了单点故障导致资源被锁定的问题,减少了事务执行过程中产生的阻塞。
存在的问题
如上图,
在 CanCommit 阶段事务管理器收到各参与全局事务的资源管理器的 Yes 消息,表示各资源管理器都可以执行事务。
在 PreCommit 阶段事务管理器向各资源管理器发送了 PreCommit 消息,资源管理器 RM1 响应了 Ack 消息,表示其本地事务已成功写入日志,执行成功,但资源管理器 RM2 执行失败,响应了 No消息,所以下一阶段事务管理器需要通知所有的资源管理器 Abort 消息,表示中止事务并回滚已执行的事务。
在 DoRollback 阶段由于事务管理器 TM 发生宕机或者事务管理器 TM 与资源管理器 RM1 之前网络通信发生故障,导致资源管理器 RM1 未能及时接收到 Abort 消息,然而资源管理器为了防止资源阻塞,会在一段时间后自动提交事务,这就导致了与其他接收到了Abort 消息并执行了事务回滚操作的资源管理器的数据不一致。
2PC 模型和 3PC 模型都没有解决数据不一致的问题。
评论区