ENIGMA AI
ENIGMA AI

Что такое уровни изоляции транзакций и какие они бывают?

встречается 14× SQL middle database

Как ответить

Уровень изоляции транзакции — это настройка, которая определяет, насколько одна транзакция видит изменения, сделанные другими одновременно выполняющимися транзакциями. Стандарт SQL определяет четыре уровня, каждый из которых решает определённый набор проблем параллельного доступа: грязное чтение, неповторяющееся чтение и фантомное чтение.

  • Read Uncommitted — минимальный уровень изоляции. Транзакция может читать данные, которые ещё не зафиксированы другими транзакциями (грязное чтение). На практике почти не используется: в PostgreSQL этот уровень эквивалентен Read Committed, в MySQL — работает как описано.
  • Read Committed — гарантирует, что читаются только зафиксированные данные. Грязное чтение исключено, но возможны неповторяющееся чтение (повторный запрос внутри одной транзакции может вернуть другой набор строк) и фантомы (при повторном запросе с условием могут появиться новые строки, добавленные другой транзакцией). Это уровень по умолчанию в PostgreSQL, Oracle, SQL Server.
  • Repeatable Read — гарантирует, что данные, прочитанные в рамках транзакции, не изменятся другими транзакциями (блокирует обновление уже прочитанных строк). Грязное и неповторяющееся чтение исключены, но фантомы остаются. В MySQL (InnoDB) этот уровень по умолчанию, причём фантомы там тоже блокируются за счёт gap locks.
  • Serializable — самый строгий уровень. Транзакции выполняются так, как если бы они шли последовательно. Полностью исключает грязное чтение, неповторяющееся чтение и фантомы. Обычно реализуется либо через блокировки на весь диапазон, либо через оптимистичные проверки (SSI в PostgreSQL). Цена — резкое падение производительности из-за конфликтов.

Пример установки уровня изоляции в PostgreSQL:

BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1;
-- другая транзакция не может изменить эту строку до завершения нашей
COMMIT;

На практике выбор уровня — это компромисс между консистентностью данных и производительностью. Большинству приложений хватает Read Committed, а для финансовых операций или отчётов, где важна повторяемость чтения, используют Repeatable Read или Serializable.

Ключевые тезисы

  • Уровни изоляции определяют, как транзакции видят изменения друг друга; стандарт SQL описывает 4 уровня: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
  • Каждый уровень решает одну или несколько проблем: грязное чтение, неповторяющееся чтение, фантомное чтение. Serializable решает все три.
  • Реализация уровней зависит от СУБД: например, в PostgreSQL по умолчанию Read Committed, а в MySQL — Repeatable Read, причём фантомы блокируются gap locks.
  • Повышение уровня изоляции увеличивает надёжность данных, но снижает параллелизм и производительность из-за блокировок или конфликтов при коммите.

Что спросят дальше

  • — В чём разница между Repeatable Read и Serializable в контексте фантомного чтения и как это реализовано в вашей основной СУБД?
  • — Как в PostgreSQL достигается Repeatable Read при использовании MVCC без блокировок на чтение?
  • — Что такое lost update (потерянное обновление) и на каком уровне изоляции оно может произойти? Как его предотвратить?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение