Middle+
Ako spracovať paralelné operácie odpočtu zostatku sekvenčne, aby sa predišlo dvojitému odpočtu (race condition)?
sobes.tech AI
Odpoveď od 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();
});
}
Таким образом, операции списания будут выполняться строго по очереди, исключая состояние гонки.