暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB A 2PC分布式事务

原创 章芋文 2019-10-01
2137

1、什么是两阶段事务

在分布式事务中,两阶段提交协议(two phase commit, 2PC)用于保证分布式事务的原子性

华为高斯200分布式事务.png

由上图显示,目前一个事务处理流程主要是CN1发起第一阶段提交,成功后CN1先向GTM发起提交,提交成功后CN1发起第二阶段提交。目前MPP中写事务又分为三类,详细的提交过程如下所述:

1:事务A涉及到所有节点(二阶段事务):CN1收到客户端SQL后,

1):CN1本地开启一个事务;

2):向GTM上获取事务xid(假如为10005)、时间戳、snapshot;

3):向CN2和DN1-4依次发送xid、时间戳、开启事务、snapshot和执行query,各个实例按顺序执行;

4):完成后CN1发起提交,首先向CN2和DN1-4发送PREPARE TRANSACTION T10005,各个实例执行第一阶段提交;

5):CN1向GTM发起事务10005提交,GTM将结束10005事务;

6):CN1在本地PREPARE TRANSACTION,然后再本地提交该事务,但不释放锁资源;

7):CN1向CN2和DN1-4发送COMMIT PREPARED T10005,各个实例执行第二阶段提交;

8):CN1释放锁资源,10005事务结束。


2:事务A只涉及到DN节点(二阶段事务):CN1收到客户端SQL后,

1):CN1本地开启一个事务;

2):向GTM上获取事务xid(假如为10005)、时间戳、snapshot;

3):向DN1-4依次发送xid、时间戳、开启事务、snapshot和执行query,各个实例按顺序执行;

4):完成后CN1发起提交,首先向DN1-4发送PREPARE TRANSACTION T10005,各个实例执行第一阶段提交;

5):CN1向GTM发起事务10005提交,GTM将结束10005事务;

6):CN1向DN1-4发送COMMIT PREPARED T10005,各个实例执行第二阶段提交;

7):CN结束本地事务。


3:事务A只涉及到DN1(一阶段事务):CN1收到客户端SQL后,

1):CN1本地开启一个事务;

2):向GTM上获取事务xid(假如为10005)、时间戳、snapshot;

3):向DN1发送xid、时间戳、开启事务、snapshot和执行query,DN1执行;

4):CN1向GTM发起事务10005提交,GTM将结束10005事务;

5):完成后CN1发起提交,首先向DN1发送COMMIT TRANSACTION,DN1执行第一阶段提交;

6):CN结束本地事务。

 

2、为什么要用两阶段事务

        简单来说,一个全局事务在多个节点上做了修改,每个节点开启了一个事务,这些修改为了满足全局事务原子性,需要同时生效或同时回滚。如果只用普通事务来实现,当其中一个节点因为各种原因无法提交而回滚时,其它节点的事务有可能已经被提交,这就造成了全局事务原子性的破坏。而两阶段提交协议可以有效保证这一点,先确定所有节点是否都可以提交,再决定大家一起提交还是一起回滚。

        一阶段提交使所有节点检测是否可以提交,如果可以则转换为prepare状态。prepare意味着事务仍然持有所有的资源,并且在收到后续提交/回滚指令之前不会做任何修改,prepare做了commit的几乎所有事情,只是没有在xlog打commit标记。一阶段提交结果记录日志,同时也记录所有占用的资源,因此可以保证即使提交后发生崩溃,prepare状态依然可恢复。一阶段提交的结果需要一个协调者来进行收集,决定二阶段需要下发提交还是回滚指令。协调者可以是更上层的事务管理器,也可以是任何一个参与者。这样当下发二阶段提交/回滚指令时,可以保证所有节点要么一起提交,要么一起回滚,从而保证了全局事务的原子性。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论