intermediate

Transactions

Используйте transactions, isolation и locking reads с учетом autocommit и deadlock retry behavior.

InnoDB даёт ACID-транзакции с row-level locking и consistent reads в стиле MVCC. При `autocommit=1` каждый statement — отдельная транзакция, пока явно не `START TRANSACTION`.

					START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

-- Пессимистичная блокировка для read-modify-write
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- логика приложения
UPDATE accounts SET balance = ? WHERE id = 1;
COMMIT;
				

Изоляция по умолчанию — REPEATABLE READ с next-key locking в InnoDB: защита от phantom ценой большего числа блокировок, чем READ COMMITTED. Deadlock возможны; InnoDB жертвует одну транзакцию — приложение должно идемпотентно повторять запись.

На интервью: autocommit vs явные транзакции; FOR UPDATE vs optimistic concurrency; стратегия retry при deadlock.

Типовые ошибки: длинные транзакции с блокировками; смешение MyISAM и InnoDB; ожидание READ COMMITTED при default RR; retry без идемпотентности.

Компромисс — более сильные гарантии изоляции против contention блокировок и сложности повторов при конкурентных записях.

Чеклист:

  • Многошаговые инварианты — в явных транзакциях.
  • Уровень изоляции под допустимые аномалии.
  • FOR UPDATE только когда нужно.
  • Retry deadlock с идемпотентными операциями.