【问题标题】:Transaction lock in MongoDBMongoDB中的事务锁
【发布时间】:2018-08-17 21:51:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb mongoose database-concurrency database-locking


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多