如果数据已更新,请阻止更新

时间:2019-01-03 05:19:45

标签: database mongodb

如果我在mongoDB中有一个文档A,则客户端X和Y都检索了A,客户端X发送了将A更新为A1的请求,现在客户端Y发送了尝试将A更新为A2的请求,mongoDB拒绝使用的设计模式是什么是你的要求吗?

1 个答案:

答案 0 :(得分:0)

您可以使用的方法称为Optimistic Concurrency。基本上,这个想法很简单,您需要其他字段来表示文档的版本。可以是任何一种时间戳或表示版本的简单数字。

db.col.save({ _id:1,  version: 1, field: "A" })

然后客户端XY都检索该文​​档。客户端X更新为A1,递增version

db.col.update({ _id: 1, version: 1 }, { $set: { field: "A1", version: 2 } }) // or $inc

它可以工作,因为两个匹配条件都很好。然后客户端Y尝试使用相同的代码设置A2

db.col.update({ _id: 1, version: 1 }, { $set: { field: "A2", version: 2 } })

但这将为您带来以下结果:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

这意味着由于指定的version与数据库中的文档不匹配,因此没有文档被修改。

然后,您可以在逻辑中为客户端Y重新加载该文档或引发某种并发异常来处理该问题。