MongoDB中的两阶段提交

时间:2013-11-08 04:34:08

标签: mongodb transactions

仔细阅读the online documentation后,我仍然有很多关于MongoDB中两阶段提交的问题。

从故障情景中恢复部分中,为什么只有两类故障?在我的思想中,失败可能发生在任何这些步骤中,所以这里应该有两个以上的类。例如,在更新帐户A后,(在对两个帐户应用交易部分中),数据库服务器失败。这意味着账户A在账户B没有发生任何事情的情况下损失了一些钱。我们会有不一致的交易吗?

3 个答案:

答案 0 :(得分:7)

当应用程序或数据库在将事务应用于A并将事务应用于B之间突然崩溃时,全局事务集合中仍将存在state:"pending"的事务。您在崩溃后运行的恢复脚本应该注意到这一点,检查这两个帐户,并在一个帐户中看到有待处理的事务,而不是另一个帐户。它现在知道要么回滚事务还是试图完成它所需要知道的一切。

是的,编写一个智能的恢复脚本并不容易。但是,不是为他们设计的数据库系统中的事务总是很难。有时您可以通过设计文档来解决MongoDB中的事务,这些文档需要一起更新的字段始终位于同一文档中,但并不总是有理由这样做。当您的用例绝对需要事务时,请保护您的理智并使用关系数据库。

答案 1 :(得分:3)

  

在我的想法中,任何一个步骤都可能发生失败,所以这里应该有两个以上的课程。

这里要记住的关键是文档不是两阶段提交的权威指南,实际上在MongoDB中技术上不可能进行两阶段提交,如果你想要执行它们,我强烈建议你获得ACID技术。

您必须记住,由于某些故障情况不属于服务器本身,因此您无法对抗某些故障情形。相反,两个阶段提交的整个存在只是客户端,因此与TTL监控相比,它非常脆弱。

  

更新帐户A后数据库服务器失败。这意味着账户A在账户B没有发生任何事情的情况下损失了一些钱。我们会有不一致的交易吗?

为了支持Philipps回答,在这种情况下,帐户A和B之间的原始交易仍然有待处理,只有在帐户B更新后才会将其移至已完成/已完成。

这意味着交易无法在完成之前标记为已完成。

不是将MongoDB用于不是真正设计的场景,而是建议使用专为您的场景设计的内容。

答案 2 :(得分:0)

在线文件可能并不完美。 实际上你需要回滚A和B上的操作