Ответ
Repeatable Read (Повторяемое чтение) — это уровень изоляции транзакций, который гарантирует, что любые строки, прочитанные в течение транзакции, не будут изменены другими транзакциями до её завершения. Это предотвращает «грязное» и «неповторяющееся» чтение, но не защищает от «фантомного чтения» (появления новых строк).
Как используется в Java (JDBC):
Connection connection = dataSource.getConnection();
// Установка уровня изоляции для соединения
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
Поведение на примере:
- Транзакция A начинает работу с
REPEATABLE READи читает значение поляX = 100. - Транзакция B изменяет
Xна200и успешно фиксирует изменения. - Транзакция A повторно читает
X— получит исходное значение100(изменение B невидимо). - Если Транзакция B добавит новую строку Y, то при повторном запросе диапазона данных Транзакция A может увидеть эту новую строку (фантом).
Когда применять:
- Когда критически важно, чтобы данные, прочитанные в начале транзакции (например, для расчета), оставались неизменными до её завершения.
- В сценариях, где появление новых записей (фантомов) не нарушает бизнес-логику.
- Часто используется по умолчанию в СУБД MySQL (InnoDB).