2pc、3pc 原理解析
2021-04-12 13:32:14 1 举报
2pc、3pc 原理解析
作者其他创作
大纲/内容
提交、回滚事务
锁定
存在的问题:1、同步阻塞:在阶段一里执行prepare操作会占用资源,一直到整个分布式事务完成,才会释放资源,这个过程中,如果有其他 人要访问这个资源,就会被阻塞住2、单点故障:TM是个单点,一旦挂掉就完蛋了3、事务状态丢失:即使把TM做成一个双机热备的,一个TM挂了自动选举其他的TM出来,但是如果TM挂掉的同时,接收到commit消息的某个库也挂了,此时即使重新选举了其他的TM,压根儿不知道这个分布式事务当前的状态,因为不知道哪个库接收过commit消息,那个接收过commit消息的库也挂了,兄弟4、脑裂问题:在阶段二中,如果发生了脑裂问题,那么就会导致某些数据库没有接收到commit消息,那就完蛋了,有些库收到了commit消息,结果有些库没有收到,这咋整呢,那肯定完蛋了
TMTransaction Manager 事务管理器
2PC
数据库资源比如锁表、数据库连接
AP应用系统
1.3 发送prepare
2.2 返回sql执行结果
prepare 执行sql但是不提交
1.2 发送prepare
3.1 发送commit
阻塞
1、CanCommit: 协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全部响应YES则进入下一个阶段。2、PreCommit: `协调者TM`向所有`参与者RM`发送`PreCommit`命令,询问是否可以进行事务的预提交操作,参与者接收到PreCommit请求后,如参与者成功的执行了事务操作,则返回`Yes`响应,进入最终commit阶段。一旦参与者中有向协调者发送了`No`响应,或因网络造成超时,协调者没有接到参与者的响应,协调者向所有参与者发送`abort`请求,参与者接受abort命令执行事务的中断。3、DoCommit 在前两个阶段中所有参与者的响应反馈均是`YES`后,协调者向参与者发送`DoCommit`命令正式提交事务,如协调者没有接收到参与者发送的ACK响应,会向所有参与者发送`abort`请求命令,执行事务的中断。
RM Resource Manager 资源管理器Mysql 快递库
3.2 发送commit
2.1 返回sql执行结果
RM Resource Manager 资源管理器Mysql 库存库
RM Resource Manager 资源管理器Mysql 订单库
RM Resource Manager 资源管理器Mysql 快递
RM Resource Manager 资源管理器Mysql 订单
3PC
如果TM得事务管理中,对某条数据进行了加锁处理,如果TM一直不执行完毕得话,那其他客户端的调用就会一直是阻塞得状态
第三方
3.3 发送commit
1、prepare : 执行本地数据脚本但不提交事务2、commit : 提交或者回滚事务
1.1 发送prepare
RM Resource Manager 资源管理器Mysql 库存
2.3 返回sql执行结果
1、CanCommit2、PreCommit3、DoCommit
提交或者回滚,通过所有的RM都成功则提交,如果有一个失败,则回滚
3PC存在的问题:1.数据不一致:在DoCommit阶段,如果因为网络问题,协调者发出的abort没有及时被参与者接收。这时候参与者最终执行了commit,就会引发数据不一致的问题。也就是A执行PreCommit失败了,然后这时候TM应该是需要发送回滚消息的,但是这时候TM挂了,所以ABC都自行得执行自己的事务,最终就会A回滚,BC执行提交,导致数据不一致。2.需要更多的通讯次数,实现复杂
不管 2PC 3PC都是长事务的占用
说明:3pc针对2pc得优点:1、引入了一个询问得操作,也就是事先就得知,当前事务是否能正常执行2、针对 PreCommit 会有一个自动提交的操作,如果超时时间到了,还没收到TM发送的DoCommit消息或者是abort消息,直接判定为TM可能出故障了,人家库自己颠儿颠儿的就执行DoCommit操作,提交事务了也就是当RM 这边未收到TM的确认提交或者回滚得时候,RM通过 PreCommit 阶段自身的成功或者失败进行了数据comnit 或者 rollback因为:如果未收到TM的消息1、TM挂了,这时候肯定是收不到协调者得消息的,然后这时候只能通过自身第二步得操作判断是 comnit 或者 rollback2、如果自身是commit,但是其他的参与者可能有rollback,这时候因为协调者挂了,这时候我们自身的事务 commit,但是其他事务是rollback,就会出现数据不一致得问题,所以也方案也会有问题
在2PC阶段,如果TM挂了或者数据库出现网络故障,无法接收commit消息此时会导致数据库一直锁住资源,别人要访问这个资源一直阻塞
https://www.cnblogs.com/dennyzhangdd/p/10975192.html说明一点:这个XA事务,应该是数据库本身就支持的一种,也就是 MysqlXAConnection ,这样的一种连接方式,核心原理先发送prepare 得消息,TM这边收到每个客户端的OK消息之后,进行数据得提交或者回滚。应该是数据库,目前就支持的,但是是有问题的`XA协议`是一个基于数据库的分布式事务协议,其分为两部分:`事务管理器`和`本地资源管理器`。`事务管理器`作为一个全局的调度者,负责对各个本地资源管理器统一号令`提交`或者`回滚`。二阶提交协议(`2PC`)和三阶提交协议(`3PC`)就是根据此协议衍生出来而来。如今`Oracle`、`Mysql`等数据库均已实现了`XA接口`。
0 条评论
回复 删除
下一页