Блокировка транзакций в 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}})

Теперь, даже если вы выполняете два запроса одновременно, только один вернет документ.

Другие вопросы по тегам