Что гарантирует уровень изоляции транзакций REPEATABLE READ в SQL?

«Что гарантирует уровень изоляции транзакций REPEATABLE READ в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REPEATABLE READ — это уровень изоляции транзакций, который гарантирует, что в рамках одной транзакции повторное чтение одних и тех же строк даст идентичный результат. Другие транзакции не могут изменить или удалить эти строки до завершения текущей транзакции.

Что он предотвращает:

  1. Грязное чтение (Dirty Read): Чтение незакоммиченных данных другой транзакции.
  2. Неповторяющееся чтение (Non-repeatable Read): Изменение значения строки другой транзакцией между двумя чтениями внутри одной транзакции.

Что НЕ предотвращает (в стандарте SQL):

  • Фантомное чтение (Phantom Read): Появление новых строк (удовлетворяющих условию запроса), добавленных другой транзакцией, между повторными чтениями. (Примечание: в MySQL/InnoDB REPEATABLE READ также предотвращает фантомы за счёт gap locks).

Пример сценария:

-- Транзакция 1 (Уровень изоляции: REPEATABLE READ)
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1; -- Возвращает 100

-- Транзакция 2 выполняется параллельно и обновляет баланс:
-- UPDATE accounts SET balance = 50 WHERE user_id = 1; COMMIT;

-- Повторное чтение в Транзакции 1:
SELECT balance FROM accounts WHERE user_id = 1; -- ВСЁ ЕЩЁ возвращает 100
COMMIT; -- После коммита будет видно новое значение 50

Почему это важно? Этот уровень используется, когда критически важна консистентность данных на протяжении всей бизнес-операции (например, при расчёте итоговой суммы на основе нескольких записей). В MySQL (InnoDB) это уровень по умолчанию.