1

我已经为 MongoDB 实现了两阶段提交,如 MongoDB 的文档中所述。基本上,这工作正常。这特别容易,因为我只关心插入新文档,我从不更新它们。

然而,我担心一个特定的场景,我不确定如何解决这个问题。所以任何帮助将不胜感激。

给定:包含具有以下结构的文档的集合:

id: ...,
subId: ...
payload: {
  ...
}

可能有多个相同的id文档,但所有相同的文档id都有增加subId。所以,你有类似的东西:

  • 1 - 1
  • 1 - 2
  • 2 - 1
  • 3 - 1
  • 3 - 2
  • 3 - 3

每个插入只处理一个id,但可能提供多个文档。所以这意味着可能会有一个带有文档3 - 4和的插入3 - 5,但永远不会有一个带有文档3 - 4和的插入4 - 1

idsubId字段由插入数据的客户端计算。

插入多个文档时,此插入被 2PC 覆盖。所以要么所有文件都被提交,要么没有。

现在问题出现在 2PC 的第二阶段。由于我不希望其他客户端能够读取未提交的数据,因此每个文档中都有一个标志,告诉我该文档是否已经提交。一旦所有文档都已写入并且事务已设置为“已完成”,作为最后一步,文档将被标记为已提交。

所以现在如果我尝试插入3 - 4and会发生什么3 - 5,两者都被写入,事务完成,并被3 - 4标记为已提交,并且在3 - 5被标记为已提交之前,另一个客户端读取所有具有 id 的文档3,将 subId4视为最高的文档,创建一个新文档3 - 5并插入它?

然后提交失败,我混合了来自两个事务的版本号。

如何解决这个问题?

4

1 回答 1

0

哦,算了……典型的“写就看到”的例子。我描述的场景没有问题,因为3 - 5第一个事务已经编写了,只是没有提交。因此作为唯一索引约束的id - subId另一个事务不能干涉。

问题解决了。

于 2012-09-29T08:34:30.157 回答