Middle+
36
Как обработать параллельные операции списания баланса последовательно чтобы избежать двойного списания (race condition)?
Сұралған компаниялар
BetBoom
AI-дан жауап
sobes.tech AI
Чтобы избежать race condition при параллельных операциях списания баланса, нужно обеспечить последовательный доступ к ресурсу. В Node.js это можно сделать несколькими способами:
- Использовать транзакции и блокировки на уровне базы данных (например, SELECT ... FOR UPDATE).
- Внедрить очередь задач (job queue), которая обрабатывает списания последовательно.
- Использовать атомарные операции базы данных (например, операции с инкрементом/декрементом).
Пример с использованием очереди на основе промисов:
const queue = [];
let processing = false;
function processQueue() {
if (processing || queue.length === 0) return;
processing = true;
const {amount, resolve, reject} = queue.shift();
// Функция списания баланса
debitBalance(amount).then(resolve).catch(reject).finally(() => {
processing = false;
processQueue();
});
}
function debitBalanceSequential(amount) {
return new Promise((resolve, reject) => {
queue.push({amount, resolve, reject});
processQueue();
});
}
Таким образом, операции списания будут выполняться строго по очереди, исключая состояние гонки.