Блокировка транзакций в MongoDB
Я пытаюсь разработать систему бронирования, которая регистрирует различные активы после проверки их доступности. Система сначала пытается прочитать записи из БД и проверяет, доступен ли зарезервированный слот. Если это так, система зарезервирует для них слот, вставив новую запись в систему.
Теперь проблема заключается в том, что если несколько пользователей запрашивают бронирование, и поскольку несколько запросов к базе данных могут чередоваться, возможно, что этот сценарий произойдет.
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 ответ
В версии 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}})
Теперь, даже если вы выполняете два запроса одновременно, только один вернет документ.