Ответ
REPEATABLE READ — это уровень изоляции транзакций, который гарантирует, что в рамках одной транзакции повторное чтение одних и тех же строк даст идентичный результат. Другие транзакции не могут изменить или удалить эти строки до завершения текущей транзакции.
Что он предотвращает:
- Грязное чтение (Dirty Read): Чтение незакоммиченных данных другой транзакции.
- Неповторяющееся чтение (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) это уровень по умолчанию.