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

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

Ответ

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

Как используется в Java (JDBC):

Connection connection = dataSource.getConnection();
// Установка уровня изоляции для соединения
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Поведение на примере:

  1. Транзакция A начинает работу с REPEATABLE READ и читает значение поля X = 100.
  2. Транзакция B изменяет X на 200 и успешно фиксирует изменения.
  3. Транзакция A повторно читает X — получит исходное значение 100 (изменение B невидимо).
  4. Если Транзакция B добавит новую строку Y, то при повторном запросе диапазона данных Транзакция A может увидеть эту новую строку (фантом).

Когда применять:

  • Когда критически важно, чтобы данные, прочитанные в начале транзакции (например, для расчета), оставались неизменными до её завершения.
  • В сценариях, где появление новых записей (фантомов) не нарушает бизнес-логику.
  • Часто используется по умолчанию в СУБД MySQL (InnoDB).