MongoDB中的事务锁定

时间:2018-08-17 21:52:00

标签: mongodb mongoose database-concurrency database-locking

我正在尝试开发一种预订系统,该系统会在检查其可用性之后预订不同的资产。系统首先尝试从数据库读取记录,然后检查预订的插槽是否可用。如果是这样,系统会通过在系统中插入新记录来为它们预订插槽。

现在的问题是,如果有多个用户在请求预订,并且由于对数据库的多个请求可以交错,则这种情况很可能发生。

User 1 -> read request start
User 2 -> read request start
User 1 -> read request success (booking available)
User 2 -> read request success (booking available)
User 1 -> write a new record to the db (new booking)
User 2 -> write a new record to the db (new booking) but this conflicts with User 1.

为避免这种情况,理想情况下,即使在读取操作开始之前,我也必须获得一个收集级别的锁,并且仅在完成最终写入后才释放该锁。

我的理解正确吗?如果可以的话,可以在MongoDB中完成吗?

任何欢迎使用MongoDB,Mongoose或@tsed/mongoose的解决方案。

1 个答案:

答案 0 :(得分:1)

4.0版之前的MongoDB中没有事务支持。要在4.0中使用事务,请查看https://www.mongodb.com/transactions

在4.0以上的版本中,您可以使用findOneAndUpdate方法来模拟它。

例如,您可以按以下方式进行修改查询:

record = db.collection.findOneAndUpdate({"in_transaction": {"$exists": False}}, {"$set": {"in_transaction": true}})

现在,即使您同时运行两个查询,也只会返回一个查询。