Ответ
Фантомное чтение — это ситуация в транзакциях, когда одна транзакция повторно читает данные и обнаруживает новые строки, добавленные другой транзакцией после первого чтения.
В 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.