Что такое уровень изоляции транзакций Repeatable Read? Приведите пример.

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

Ответ

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

Пример на SQL (PostgreSQL):

-- Сессия 1: Устанавливаем уровень изоляции и начинаем транзакцию
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;

-- Первое чтение баланса
SELECT balance FROM accounts WHERE id = 1;
-- Результат: 100

-- В это время Сессия 2 выполняет и коммитит:
-- UPDATE accounts SET balance = 200 WHERE id = 1;

-- Повторное чтение в Сессии 1 покажет старое значение
SELECT balance FROM accounts WHERE id = 1;
-- Результат: 100 (значение не изменилось, неповторяющееся чтение предотвращено)

COMMIT;
-- После коммита последующие запросы увидят новое значение (200).

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