MongoDB两阶段提交中“初始”状态的目的

时间:2013-09-18 00:00:58

标签: mongodb

引用this article关于使用MongoDB执行两阶段提交:

交易“初始”状态的目的是什么?为什么不直接插入具有“待处理”状态的交易文档并保存到数据库的往返?

2 个答案:

答案 0 :(得分:0)

如果有多个应用程序运行相同的事务,如后面the article中所述,“初始”状态基本上意味着逻辑锁是免费的,因此findAndModify()可以更新文档以获取该锁。因此,只允许一个应用程序运行该事务。

答案 1 :(得分:0)

初始状态实际上有充分的理由:2PC协议定义了一个具有“初始”状态的状态机,该状态转换为“挂起”。一旦所有参与者处于待定状态,交易应仅处于“待定”状态。此外,只有在事务处于“挂起”状态时才能启动到“提交”的转换。最后,只有在所有参与者成功提交后,才应将交易标记为“已提交”。

如果您在没有完全达到挂起状态的情况下开始提交转换,则可能会破坏原子性和隔离保证。

在引用的文章中,在将参与者设置为pending(插入记录)之前,事务状态已更改为pending。在提交参与者之前将事务状态设置为已提交。还有一个名为“done”的额外状态,这可能会导致协调器实现中出现错误。我建议你带上一粒盐。