NodeJS MongoDB 锁定文档
NodeJS MongoDB locks on documents
我正在使用 mongodb 驱动程序,我担心可能会出现复制对象的并发问题。看了几个stack overflows的问答我认为写操作是原子的,但这可能并不能解决我的并发问题。假设有两个对 doSomeAndDelete
的并发调用具有相同的 id
:HERE
中的操作可能需要一些时间,但这两个函数中只有一个应该能够处理 result
.如何实现锁定?
async function doSomeAndDelete(id){
const result = await myCollection.findOne({ _id : id });
/*Some operations on result [HERE]*/
if(/*conditions*/)
await myCollection.deleteOne({ _id : id});
}
对于删除,只有一个操作会成功并删除文档,而另一个操作不会删除任何内容,因为文档已不存在。假设 _id
不会被重用。
一般来说,对文档的写入操作是原子的,因此如果您有多个线程写入文档,您可能需要使用 mongodb 事务,或使用某种形式的乐观锁定。例如,您可以将文档中的 ObjectId 字段用作版本 ID,并为每次更新使用新值。当您读取和更新文档时,您会验证该字段具有您从读取中获得的相同值,这意味着该记录在您读取后未被修改。
我正在使用 mongodb 驱动程序,我担心可能会出现复制对象的并发问题。看了几个stack overflows的问答我认为写操作是原子的,但这可能并不能解决我的并发问题。假设有两个对 doSomeAndDelete
的并发调用具有相同的 id
:HERE
中的操作可能需要一些时间,但这两个函数中只有一个应该能够处理 result
.如何实现锁定?
async function doSomeAndDelete(id){
const result = await myCollection.findOne({ _id : id });
/*Some operations on result [HERE]*/
if(/*conditions*/)
await myCollection.deleteOne({ _id : id});
}
对于删除,只有一个操作会成功并删除文档,而另一个操作不会删除任何内容,因为文档已不存在。假设 _id
不会被重用。
一般来说,对文档的写入操作是原子的,因此如果您有多个线程写入文档,您可能需要使用 mongodb 事务,或使用某种形式的乐观锁定。例如,您可以将文档中的 ObjectId 字段用作版本 ID,并为每次更新使用新值。当您读取和更新文档时,您会验证该字段具有您从读取中获得的相同值,这意味着该记录在您读取后未被修改。