我正在尝试开发一种预订系统,该系统会在检查其可用性之后预订不同的资产。系统首先尝试从数据库读取记录,然后检查预订的插槽是否可用。如果是这样,系统会通过在系统中插入新记录来为它们预订插槽。
现在的问题是,如果有多个用户在请求预订,并且由于对数据库的多个请求可以交错,则这种情况很可能发生。
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的解决方案。
答案 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}})
现在,即使您同时运行两个查询,也只会返回一个查询。