>_ IzzyLab

Практическое задание

PostgreSQL: перевод денег в транзакции

сложно

В базе shop есть таблица accounts(id, owner, balance) с ограничением CHECK (balance >= 0): alice = 100, bob = 0. Переведи 30 от alice к bob одной транзакцией (BEGIN … COMMIT, два UPDATE). Итог: alice = 70, bob = 30.

Что потренируешь:
  • postgresql
  • транзакции
  • begin/commit
  • update
  • check-ограничение

Разбор темы

Транзакция в PostgreSQL — это способ выполнить несколько операций как единое неделимое целое: между BEGIN и COMMIT изменения либо применяются все разом, либо не применяются вовсе. Ключевая идея перевода денег — атомарность: списание и зачисление должны либо оба состояться, либо оба откатиться (ROLLBACK), иначе деньги исчезнут или удвоятся. Ограничение вроде CHECK (balance >= 0) работает на уровне СУБД и уронит транзакцию, если она нарушает инвариант, — целостность гарантирует база, а не приложение. Важная тонкость psql: команды, отправленные по отдельности, коммитятся каждая сама по себе, поэтому всю транзакцию нужно выполнить в одном сеансе.

Что проверяется

  1. у alice осталось 70
  2. у bob стало 30

Как это выглядит