Как предотвратить параллельные запросы во время выполнения серии транзакций в MongoDB? - PullRequest
0 голосов
/ 01 мая 2020

Я пытался решить проблему, состоящую в том, чтобы предотвратить обслуживание другого запроса до завершения серии транзакций.

Я думаю, что когда пользователь запускает два или более одновременных запроса к серверу Node, это может вызвать некоторые проблемы при чтении / записи в MongoDB, что создает проблему безопасности. Псевдокод выглядит так:

//When user buy something, check if the user has sufficient balance, then send a deliver order and deduct the balance.
app.post('/buy', (req, res) => {
    //Step 1: Get balance from MongoDB with mongoose
    balance.find(...)

    // Step 2: Check if balance sufficient, issue a delivery order
    if (balance >= price){ //run delivery order code to deliver item }

    // Step 3: Deduct balance, then write new balance back to Mongo database
    balance = balance - price;
    balance.findOneAndUpdate(...)
})

Здесь кроется проблема. Если пользователь одновременно запускает два или более запросов, у каждого может быть шанс прочитать базу данных. Из-за этого они проходят проверку баланса, и их действия будут успешно выполнены с заказами на доставку. Если у пользователя достаточно баланса только для покупки одного предмета, это вызовет проблему «двойных расходов», поскольку пользователь будет успешно покупать более одного раза.

Мой вопрос в этой ситуации: как предотвратить следующее? запрос (который будет в течение миллисекунды после предыдущего запроса) от запуска на шаге 1 до тех пор, пока все транзакции не будут завершены для предыдущего запроса (до завершения шага 3)?

В документации MongoDB упоминается что-то вроде параллелизма и блокировки, однако не указано, как использовать их в серии транзакций, как описано выше. Также неясно, применима ли в этой ситуации так называемая «многодокументная транзакция», также не хватает кода, чтобы показать, как их использовать. У переполнения стека есть только несколько связанных вопросов, но решения немного расплывчаты, и почти у всех нет кода решения в качестве ссылки.

1 Ответ

0 голосов
/ 02 мая 2020

MongoDB реализует транзакции начиная с 4.0, поэтому вам следует использовать их, если вы ищете поведение транзакций для нескольких операций.

На странице, на которой есть ссылки, также приведены примеры на разных языках.

...