Какую аномалию конкурентного доступа предотвращает уровень изоляции Repeatable Read?

Ответ

Уровень изоляции Repeatable Read (повторяемое чтение) решает проблему неповторяющегося чтения (Non-Repeatable Read).

Что такое аномалия Non-Repeatable Read?

Это ситуация, когда в рамках одной транзакции повторное чтение одной и той же строки возвращает разные данные. Это происходит, если другая транзакция успевает изменить или удалить эту строку и зафиксировать (commit) свои изменения между двумя чтениями.

Сценарий аномалии:

  1. Транзакция 1 читает баланс счёта ID=123. Получает balance = 1000.
  2. Транзакция 2 списывает 300 со счёта ID=123 и успешно коммитится. Баланс становится 700.
  3. Транзакция 1 в рамках своих дальнейших операций снова читает баланс счёта ID=123 и внезапно получает balance = 700. Данные, которые она видела в начале, изменились, что может нарушить логику транзакции.

Как Repeatable Read это решает?

Этот уровень изоляции гарантирует, что если транзакция прочитала строку, то любые последующие чтения этой же строки в рамках той же транзакции вернут те же самые значения. База данных, как правило, достигает этого с помощью снимков данных (MVCC) или блокировок на чтение для всех прочитанных строк до конца транзакции.

Что Repeatable Read не решает?

Важно понимать, что этот уровень изоляции не защищает от аномалии фантомного чтения (Phantom Read). Фантом — это ситуация, когда при повторном выполнении запроса с одним и тем же условием WHERE в выборку попадают новые строки, добавленные другой транзакцией. Repeatable Read гарантирует стабильность уже прочитанных строк, но не защищает от появления новых.