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 с идемпотентными операциями.