如果我在mongoDB中有一个文档A,则客户端X和Y都检索了A,客户端X发送了将A更新为A1的请求,现在客户端Y发送了尝试将A更新为A2的请求,mongoDB拒绝使用的设计模式是什么是你的要求吗?
答案 0 :(得分:0)
您可以使用的方法称为Optimistic Concurrency。基本上,这个想法很简单,您需要其他字段来表示文档的版本。可以是任何一种时间戳或表示版本的简单数字。
db.col.save({ _id:1, version: 1, field: "A" })
然后客户端X
和Y
都检索该文档。客户端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
重新加载该文档或引发某种并发异常来处理该问题。