> Что такое грязное чтение, фантомное чтение и неповторяемое чтение в транзакциях (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Грязное чтение (dirty read) - чтение данных, которые были изменены другой транзакцией, но ещё не зафиксированы (не выполнен COMMIT). Если та транзакция откатится, прочитанные данные окажутся некорректными.
Пример: транзакция A обновляет баланс пользователя с 100 на 200, транзакция B читает 200, затем A откатывается - B видит несуществующее значение.

Неповторяемое чтение (non-repeatable read) - ситуация, когда при повторном чтении одной и той же строки в рамках одной транзакции получаются разные результаты из-за того, что другая транзакция изменила и зафиксировала эту строку между двумя чтениями.
Пример: транзакция A читает баланс = 100, транзакция B обновляет его до 200 и фиксирует, A снова читает - получает 200.

Фантомное чтение (phantom read) - при повторном выполнении одного и того же запроса в рамках транзакции появляются новые строки (или исчезают старые), которые были добавлены (или удалены) другой зафиксированной транзакцией.
Пример: транзакция A запрашивает пользователей с балансом > 0, получает 2 строки; транзакция B добавляет нового пользователя с балансом 50 и фиксирует; A повторяет запрос - видит 3 строки.

Уровни изоляции транзакций в SQL (и Go-драйверах, например, database/sql) решают эти проблемы:

  • READ UNCOMMITTED - допускает грязное чтение.
  • READ COMMITTED - предотвращает грязное чтение, но допускает неповторяемое и фантомное.
  • REPEATABLE READ - предотвращает грязное и неповторяемое чтение, но допускает фантомное.
  • SERIALIZABLE - полностью исключает все три аномалии.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью