Получить доступ

Какой уровень изоляции транзакций по стандарту SQL гарантированно предотвращает phantom reads?

MiddleТранзакции и изоляцияSQLPostgreSQL
Ещё спрашивают так:
  • Какие уровни изоляции есть в SQL?
  • Что такое фантомное чтение?
Коротко

По стандарту SQL фантомы гарантированно исключает только SERIALIZABLE. На практике PostgreSQL не показывает фантомов уже на REPEATABLE READ благодаря снимку.

  • READ UNCOMMITTED — возможно всё, включая грязное чтение
  • READ COMMITTED — нет грязного чтения
  • REPEATABLE READ — нет неповторяемого чтения; фантомы по стандарту возможны

А ещё Стандарт описывает минимальные гарантии — реализации часто дают больше

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Уровни изоляции: версии строк, снимки и аномалии

Подробно

Фантом — повторный запрос с тем же условием возвращает другой набор строк, потому что другая транзакция вставила или удалила подходящие строки.

Стандарт SQL определяет уровни через запрещённые аномалии:

УровеньГрязное чтениеНеповторяемоеФантом
READ UNCOMMITTEDвозможновозможновозможно
READ COMMITTEDнетвозможновозможно
REPEATABLE READнетнетвозможно
SERIALIZABLEнетнетнет

Реализации:

  • PostgreSQL на REPEATABLE READ работает со снимком на всю транзакцию — фантомов не видно, но возможна асимметрия записи (write skew); READ UNCOMMITTED ведёт себя как READ COMMITTED; SERIALIZABLE — SSI с откатом конфликтующих транзакций;
  • MySQL InnoDB по умолчанию REPEATABLE READ: обычный SELECT читает снимок, а блокирующие чтения (FOR UPDATE) ставят gap-блокировки, чтобы не появлялись фантомы;
  • Oracle не имеет REPEATABLE READ; SERIALIZABLE там — изоляция снимка.

Поэтому на собеседовании хороший ответ — «по стандарту SERIALIZABLE, но в конкретной базе нужно смотреть реализацию».

Пример

-- T1                                   -- T2
BEGIN ISOLATION LEVEL READ COMMITTED;
SELECT count(*) FROM orders WHERE status = 'new';  -- 5
                                        INSERT INTO orders(status) VALUES ('new'); COMMIT;
SELECT count(*) FROM orders WHERE status = 'new';  -- 6 — фантом

Что хотят услышать

  • Определение фантома.
  • Уровни стандарта и что каждый запрещает.
  • Ответ: SERIALIZABLE по стандарту.
  • Различия реализаций — плюс.

Частые ошибки

  • Путать фантом с неповторяемым чтением.
  • Считать, что все базы реализуют уровни одинаково.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗READ UNCOMMITTED
  • ✗READ COMMITTED
  • ✗REPEATABLE READ
  • ✓SERIALIZABLE

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

  • Чем phantom read отличается от non-repeatable read?
  • Как InnoDB предотвращает phantom?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем