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

openGauss分布式事务原子性和两阶段提交协议

openGauss小助手 2021-10-16
1336

为了保证分布式事务的原子性,防止出现如图10-2中所示的部分DN提交、部分DN回滚的“中间态”事务,openGauss采用两阶段提交(2PC)协议。

图10-18 两阶段提交流程示意图

如图10-18所示,顾名思义,两阶段提交协议将事务的提交操作分为两个阶段:

阶段一,准备阶段(prepare phase),在这个阶段,将所有提交操作所需要使用到的信息和资源全部写入磁盘,完成持久化;

阶段二,提交阶段(commit prepared phase),根据之前准备好的提交信息和资源,执行提交或回滚操作。

两阶段提交协议之所以能够保证分布式事务原子性的关键在于:一旦准备阶段执行成功,那么提交需要的所有信息都完成持久化下盘,即使后续提交阶段某个DN发生执行错误,该DN可以再次从持久化的提交信息中尝试提交,直至提交成功。最终该分布式事务在所有DN上的状态一定是相同的,要么所有DN都提交,要么所有DN都回滚。因此,对外来说,该事务的状态变化是原子的。

表10-3总结了在openGauss分布式事务中的不同阶段,如果发生故障或执行失败,分布式事务的最终提交/回滚状态,读者可自行推演,本文不再赘述。

表10-3 发生故障或执行失败时事务的最终状态

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

评论