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.