Sobes.tech
Назад к вопросам
Middle+
5

Как обработать параллельные операции списания баланса последовательно чтобы избежать двойного списания (race condition)?

Компании, где спрашивали
BetBoom

Ответ от нейросети

sobes.tech AI

Чтобы избежать race condition при параллельных операциях списания баланса, нужно обеспечить последовательный доступ к ресурсу. В Node.js это можно сделать несколькими способами:

  1. Использовать транзакции и блокировки на уровне базы данных (например, SELECT ... FOR UPDATE).
  2. Внедрить очередь задач (job queue), которая обрабатывает списания последовательно.
  3. Использовать атомарные операции базы данных (например, операции с инкрементом/декрементом).

Пример с использованием очереди на основе промисов:

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();
  });
}

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