>_ IzzyLab

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

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

сложно

В базе /root/bank.db есть таблица accounts(name TEXT, balance INTEGER) со счетами: у Anna баланс 100, у Boris30. Переведи 50 со счёта Anna на счёт Boris, выполнив оба изменения атомарно в одной транзакции (BEGIN ... COMMIT). После перевода у Anna должно стать 50, у Boris — 80, а суммарный баланс не измениться.

Что потренируешь:
  • транзакции
  • begin commit
  • атомарность
  • update
  • sqlite3

Разбор темы

Транзакция объединяет несколько операций в одну неделимую единицу: либо применяются все изменения, либо ни одного. Для перевода денег это принципиально — недопустимо, чтобы сумма списалась с одного счёта, но не зачислилась на другой. Открывается транзакция командой BEGIN, фиксируется COMMITROLLBACK откатил бы всё); чтобы несколько UPDATE попали в одну транзакцию, их нужно выполнить в одной сессии sqlite3. Корректность легко проверить инвариантом — суммарный баланс до и после перевода обязан совпадать.

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

  1. со счёта отправителя списано 50
  2. на счёт получателя зачислено 50
  3. суммарный баланс сохранился

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