持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
2PC
第一阶段:准备阶段
TM询问RM是否可以执行提交操作,并等待各RM响应
RM执行所有事务,并将undo信息和redo信息写入日志
第二阶段:提交阶段
情况一:RM都回复yes
1、TM向RM发送commit通知;
2、RM收到通知,执行提交操作,即commit操作,释放资源;
3、RM发送ACK消息
情况二和三:TM等待响应超时、RM中有一个回复no
1、TM向RM发送Rollback通知,请求回滚资源;
2、RM收到事务回滚通知之后执行rollback操作,
3、RM返回rollback信息
2PC需要三个接口。Commit、Prepare、Rollback,也就是XA协议
人工补偿方案
提交的时候有一个失败了怎么办?
一个commit成功,一个网络失败,导致它没有成功,这时候进行人工补偿。定时任务去执行
缺点
1、单点问题:
阶段2的时候,如果TM宕机了,RM就无法收到事务提交或者回滚的信息,那么一直处于阻塞状态,会一直消耗着资源
2、性能
阶段一的时候,一旦锁定资源后,都需要所有节点返回才能进入下一阶段,不能很好地应对高并发场景。
3、数据不一致
假设第二阶段后,TM发出commit通知,但是由于网络问题,一部分RM没有收到,这就导致了他们一直处于阻塞阶段,导致数据的不一致。
4、局限性,二阶段提交主要用在两个数据库之间(数据库实现了XA协议),但现在的业务,比如支付宝转账,是两个系统之间的转账,而不是底层两个数据库之间的交互,所以没办法使用2PC
3PC
在第二阶段缺少超时设置,第二阶段只有协调者有超时时间
参与者没有超时机制,协调者挂了,参与者还在等着
所以3阶段进行了改进,协调者参与者都有超时机制,如果参与者第三阶段迟迟等不到消息,就提交。
第三次的意义就是事务的完整性