Я пытался решить проблему, состоящую в том, чтобы предотвратить обслуживание другого запроса до завершения серии транзакций.
Я думаю, что когда пользователь запускает два или более одновременных запроса к серверу 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 упоминается что-то вроде параллелизма и блокировки, однако не указано, как использовать их в серии транзакций, как описано выше. Также неясно, применима ли в этой ситуации так называемая «многодокументная транзакция», также не хватает кода, чтобы показать, как их использовать. У переполнения стека есть только несколько связанных вопросов, но решения немного расплывчаты, и почти у всех нет кода решения в качестве ссылки.