在MongoDB中,乐观锁可以通过在文档中添加一个版本号或时间戳来实现。
例如,假设有一个名为users
的集合,文档结构如下:
{
_id: ObjectId("5f7a43a822a0b03b504d918c"),
name: "John",
age: 30,
version: 1
}
要更新该文档,可以使用以下代码:
db.users.updateOne(
{ _id: ObjectId("5f7a43a822a0b03b504d918c"), version: 1 },
{ $set: { age: 31 }, $inc: { version: 1 } }
)
如果其他客户端在你更新之前修改了文档,那么它们的更新操作将无法匹配到正确的版本号,因此无法成功更新文档。
例如,假设有一个名为users
的集合,文档结构如下:
{
_id: ObjectId("5f7a43a822a0b03b504d918c"),
name: "John",
age: 30,
lastUpdated: ISODate("2021-01-01T00:00:00Z")
}
要更新该文档,可以使用以下代码:
db.users.updateOne(
{ _id: ObjectId("5f7a43a822a0b03b504d918c"), lastUpdated: ISODate("2021-01-01T00:00:00Z") },
{ $set: { age: 31 }, $set: { lastUpdated: new Date() } }
)
如果其他客户端在你更新之前修改了文档,那么它们的更新操作将无法匹配到正确的最后更新时间,因此无法成功更新文档。
需要注意的是,乐观锁只能在应用层面起到一定的并发控制作用,不能完全避免并发冲突的发生。在高并发场景下,可能会有多个客户端同时检查版本号或时间戳,并尝试更新文档,因此仍然需要在应用层面处理并发冲突的情况。