Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: concurrency, race, condition

Как предотвратить списание средств сверх доступного баланса?

Вопрос проверяет умение защищаться от гонок данных и некорректных проверок в конкурентной среде.

Короткий ответ

Проверка баланса должна выполняться внутри транзакции, а не в коде приложения. Иначе два параллельных запроса могут пройти проверку одновременно. Обычно используют блокировки строк или атомарные SQL-операции. Это гарантирует, что баланс не уйдёт в минус.

Длинный ответ

Ключевая проблема

Проверка вида if balance >= amount вне транзакции небезопасна.

Основные способы защиты

Перед выбором подхода важно учитывать уровень конкуренции.

  1. Блокировка строки

    • SELECT ... FOR UPDATE

    • защита от параллельных изменений

  2. Атомарный UPDATE

    • обновление только при достаточном балансе

    • проверка и списание в одном запросе

  3. Проверка результата операции

    • анализ количества затронутых строк

    • откат при неуспехе

Пример безопасного списания

UPDATE users
SET balance = balance - 100
WHERE id = :user_id AND balance >= 100;

Если обновлено 0 строк — средств недостаточно.

Вывод

Защита от перерасхода баланса должна быть реализована на уровне базы данных, а не только в бизнес-логике.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

Ключевые слова

#concurrency

#race

#condition

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.