Проверяет знание транзакций на практическом примере.
Нужно использовать транзакции с блокировкой строк (SELECT FOR UPDATE), чтобы избежать одновременного изменения баланса разными транзакциями.
Проблема: если две транзакции одновременно списывают деньги, они могут прочитать одинаковое значение баланса и превысить лимит.
Решения:
Транзакция + SELECT FOR UPDATE — блокирует строку:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- проверка баланса и UPDATE
COMMIT;Проверка и обновление в одном запросе:
UPDATE accounts
SET balance = balance - 100
WHERE id = 1 AND balance >= 100;Если обновлено 0 строк — недостаточно средств или параллельная транзакция победила.
Этот подход атомарен.
Уровень изоляции Repeatable Read или выше — для защиты от фантомных чтений, если запрос зависит от агрегатов.
Вывод:
Лучшее решение — атомарный UPDATE с проверкой условий в одном запросе.
SELECT FOR UPDATE подходит, если логика сложнее и требует промежуточных вычислений.
Уровень
Рейтинг:
5
Сложность:
8
Навыки
Golang
Postgres
Ключевые слова
Подпишись на Golang Developer в телеграм