一,2PC 二阶段提交协议,介绍
如下单:涉及订单服务,库存服务,库存服务执行失败,协调者会告诉订单服务进行回滚。
概括为:两个角色:参与者,协调者,参与者将操作成败通知协调者,再有协调者决定是否提交操作,或终止操作。
第一阶段:准备阶段;多个事物,各自本地事物,不提交
事物协调者给每个参与者发送prepare消息,参与者要么返回执行失败,要么执行本地事物,写本地的redo 和 undo日志,但不提交。
详细分为三个阶段:
1.协调者问每个协调者是否可以提交,等待响应
2.参与者执行事物操作,并写入redo和undo日志,注意:若成功每个参与者已经执行了事物
订单服务,库存服务,各自执行自己的事物
3.参与者响应,参与者执行事物成功,返回同意消息,执行失败,返回终止消息
第二阶段:提交或回滚
如果协调者收到参与者的失败消息或者超时,则给每个参与者发送回滚消息,否则会发送提交消息,然后参与者根据协调者消息,提交或者回滚,最终完成事物。
图文分别演示完整过程,提交或回滚
二,缺点
1.同步阻塞。参与者是事物阻塞的,占用公共资源(数据库连接),第三方节点可能阻塞
2.单点故障。协调者故障,参与者一直阻塞下去,尤其第二阶段,参与者处于锁定事物资源状态中,无法继续完成事物
3.数据不一致。第二阶段中,发生局部网络异常或者发送commit请求中协调者故障。导致部分参与者执行成功,部分失败
三,3PC
1.can commit
与2pc第一阶段很像,询问:协调者发送commit请求;响应:参与者可以提交返回YES响应,否则返回NO响应,不同的是2pc在第一阶段参与者执行了本地事物,这里并没有执行本地事物
2.pre commit
协调者根据参与者响应决定是否执行preCommit操作,都是返回YES,执行本地事物,写入redo undo log。
事物中断:协调者收到任意NO,或等待超时,执行事物中断
发送中断请求,协调者向所有参与者发送abort请求,参与者收到abort请求,执行事物中断,注意此时参与者并未执行本地事物。
3.do commit
四,区别
3pc多了第一阶段,参与者没有执行本地事物,在第二阶段才执行,没有占用资源。