intermediate
Transactions
Группируйте reads и writes в atomic units, чтобы invariants переживали errors, retries и concurrent requests.
Транзакция объединяет один или несколько операторов в атомарную единицу: либо все изменения фиксируются вместе, либо не остаётся ничего (`ROLLBACK`). Свойства ACID позволяют инвариантам выдерживать ошибки, повторы и параллельные сессии.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
INSERT INTO ledger (debit, credit, amount) VALUES (1, 2, 100);
COMMIT;
-- ROLLBACK при любой ошибке
| Свойство | На практике | |----------|-------------| | Atomicity | Commit «всё или ничего» | | Consistency | Правила приложения и БД после commit | | Isolation | Параллельные tx видят контролируемые срезы | | Durability | Зафиксированные данные переживают сбой (WAL) |
Держите транзакции короткими — длинные tx держат locks и мешают vacuum. Идемпотентные повторы требуют стабильных ключей или таблиц дедупликации, чтобы повторный transfer не списал дважды.
На интервью: набросайте перевод денег или списание со склада и где границы `BEGIN`/`COMMIT`, а где optimistic retry в приложении.
Типовые ошибки: autocommit на каждый statement скрывает частичные обновления; огромные транзакции в batch-задачах; retry без идемпотентности; вызовы внешних API внутри открытой транзакции.
Компромисс — между жёсткими атомарными инвариантами и длительностью удержания locks / пропускной способностью: ограничивайте транзакцию минимальным набором операторов, которые должны пройти вместе.
Чеклист:
- Сформулируйте инвариант, который защищает транзакция.
- Минимизируйте объём и длительность.
- Явно обработайте `ROLLBACK` и ошибки.
- Спроектируйте повторы как идемпотентные.
- Отделите работу БД от внешних side effects.