为了保证分布式事务的原子性,防止出现如图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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




