在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() } }
)
如果其他客戶端在你更新之前修改了文檔,那么它們的更新操作將無法匹配到正確的最后更新時間,因此無法成功更新文檔。
需要注意的是,樂觀鎖只能在應用層面起到一定的并發控制作用,不能完全避免并發沖突的發生。在高并發場景下,可能會有多個客戶端同時檢查版本號或時間戳,并嘗試更新文檔,因此仍然需要在應用層面處理并發沖突的情況。