7

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

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

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的任何解决方案。

4

1 回答 1

6

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

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

例如,您可以像这样执行修改查询:

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

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

于 2018-08-18T07:02:43.037 回答