我已经为 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
。
id
和subId
字段由插入数据的客户端计算。
插入多个文档时,此插入被 2PC 覆盖。所以要么所有文件都被提交,要么没有。
现在问题出现在 2PC 的第二阶段。由于我不希望其他客户端能够读取未提交的数据,因此每个文档中都有一个标志,告诉我该文档是否已经提交。一旦所有文档都已写入并且事务已设置为“已完成”,作为最后一步,文档将被标记为已提交。
所以现在如果我尝试插入3 - 4
and会发生什么3 - 5
,两者都被写入,事务完成,并被3 - 4
标记为已提交,并且在3 - 5
被标记为已提交之前,另一个客户端读取所有具有 id 的文档3
,将 subId4
视为最高的文档,创建一个新文档3 - 5
并插入它?
然后提交失败,我混合了来自两个事务的版本号。
如何解决这个问题?