Что такое фантомное чтение

«Что такое фантомное чтение» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

В Go это можно проиллюстрировать так:

// Транзакция 1
tx1, _ := db.Begin()
var count int
tx1.QueryRow("SELECT COUNT(*) FROM users").Scan(&count) // Читает 10 записей

// Транзакция 2
tx2, _ := db.Begin()
tx2.Exec("INSERT INTO users (name) VALUES ('phantom')")
tx2.Commit()

// Транзакция 1 снова читает
tx1.QueryRow("SELECT COUNT(*) FROM users").Scan(&count) // Теперь 11 записей!
tx1.Commit()

Уровень изоляции REPEATABLE READ в некоторых СУБД (например, PostgreSQL) предотвращает фантомы, но в других (MySQL InnoDB) — нет. Для полной защиты используйте SERIALIZABLE.