MongoDB中的事务锁

8
我正在尝试开发一个预订系统,可以在检查可用性后预订不同的资产。该系统首先尝试从数据库中读取记录,并检查所预订的时段是否可用。如果可用,则通过向系统插入新记录来为其预订该时段。
现在的问题是,如果有多个用户请求预订,由于对数据库的多个请求可能交错,因此可能会出现这种情况。
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个回答

7

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}})

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

1
findOneAndUpdate是在v3.2中引入的 - https://docs.mongodb.com/v3.2/reference/method/db.collection.findOneAndUpdate/ - barrypicker
从技术角度来看,3.2确实高于4.0。 - Mikhail
一些附加信息在https://www.mongodb.com/blog/post/how-to-select--for-update-inside-mongodb-transactions。 - Mmmh mmh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接