Middle+
¿Cómo procesar operaciones paralelas de deducción de saldo de manera secuencial para evitar doble deducción (condición de carrera)?
sobes.tech AI
Respuesta de la IA
Чтобы избежать 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();
});
}
Таким образом, операции списания будут выполняться строго по очереди, исключая состояние гонки.