MongoDB乐观锁定重试

时间:2018-07-27 02:21:42

标签: mongodb optimistic-concurrency

假设我有多个客户端,并且所有客户端都连接到同一个Mongo数据库。每个文档都有一个版本号,以确保不会丢失数据。

文档#1

{
    __v: 0,
    _id: 1,
    quantity: 5
}

更新到达服务器,将__v设为0,将文档更新为数量10。

Collection.update({_id: 1, __v: 0}, {$set: {quantity: 10}, $inc: {__v: 1}});

现在只需说紧接着是另一个更新,如下所示:

Collection.update({_id: 1, __v: 0}, {$set: {quantity: 15}, $inc: {__v: 1}});

由于更新的__v不是1,因此不会发生此更新,因此客户端会收到错误。这就是我要解决的问题。

问题#1

如果属性没有冲突,则使用旧的__v:0文档合并第二次更新可以工作,但是如果它们在本示例中一样,则不确定如何解决此问题。

我想也许我可以保留文档的历史记录,以某种方式将更新与版本号进行比较(第二个为15,减去初始文档为5,得到$ inc为10),然后取数量10和$ inc 10的最新文档版本总计为20?不知道这是一个坏主意。嵌套数组被删除/按下怎么办?

问题2

说我要更新3个不同的集合,并且需要全部3个正常工作或全部3个失败(它们需要同步)。因此,如果对集合的两次更新正常工作,而第三次失败,该怎么办,我需要回滚其他两个集合更新,以使其保持同步。

我正在使用oplog尝试获取“实时”数据,但是在某些情况下,实时数据响应客户端之前可能会发生两次更新,并且我试图阻止用户获取错误消息并宁愿处理服务器上的这些更新。

0 个答案:

没有答案