Ответ
REPEATABLE READ и SERIALIZABLE — это строгие уровни изоляции транзакций в SQL, отличающиеся обработкой фантомных чтений (Phantom Reads).
- REPEATABLE READ: Гарантирует, что любые данные, прочитанные в течение транзакции, не изменятся другими транзакциями до её завершения. Однако другие транзакции могут добавлять новые строки, которые попадут в результаты последующих запросов первой транзакции (фантомное чтение).
- SERIALIZABLE: Самый строгий уровень. Гарантирует полную изоляцию, как если бы транзакции выполнялись последовательно. Помимо гарантий
REPEATABLE READ, он предотвращает фантомные чтения за счёт блокировки диапазонов записей или использования версионных механизмов.
Ключевые отличия:
- Фантомные чтения:
REPEATABLE READих допускает,SERIALIZABLE— предотвращает. - Производительность:
SERIALIZABLEиспользует более жёсткие блокировки, что может привести к большему количеству конфликтов и ожиданий, снижая пропускную способность. - Использование:
REPEATABLE READ— хороший баланс для большинства задач (стандарт в MySQL InnoDB).SERIALIZABLEиспользуется для критичных операций, где абсолютная согласованность данных важнее производительности.
Пример настройки в Java (JDBC):
// Установка уровня изоляции для соединения
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
// или
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);