Какой уровень изоляции транзакций по стандарту SQL гарантированно предотвращает phantom reads?
- Какие уровни изоляции есть в SQL?
- Что такое фантомное чтение?
По стандарту SQL фантомы гарантированно исключает только SERIALIZABLE. На практике PostgreSQL не показывает фантомов уже на REPEATABLE READ благодаря снимку.
- READ UNCOMMITTED — возможно всё, включая грязное чтение
- READ COMMITTED — нет грязного чтения
- REPEATABLE READ — нет неповторяемого чтения; фантомы по стандарту возможны
А ещё Стандарт описывает минимальные гарантии — реализации часто дают больше
Подробно
Фантом — повторный запрос с тем же условием возвращает другой набор строк, потому что другая транзакция вставила или удалила подходящие строки.
Стандарт 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?
Разбор темы
- Транзакции, изоляция и блокировки
ACID по буквам, аномалии чтения, уровни изоляции, MVCC и оптимистичные/пессимистичные блокировки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.