Ответ
Уровни изоляции транзакций — это стандарты (определенные в SQL ANSI), которые регулируют видимость изменений, сделанных одной транзакцией, для других параллельных транзакций. Они решают проблемы параллельного доступа к данным, балансируя между согласованностью и производительностью.
Основные проблемы, которые решаются:
- Грязное чтение (Dirty Read): Чтение незафиксированных данных другой транзакции, которые могут быть откатаны.
- Неповторяющееся чтение (Non-repeatable Read): Получение разных значений одного и того же поля при повторном чтении в рамках одной транзакции (данные изменила другая транзакция).
- Фантомное чтение (Phantom Read): Появление новых строк или исчезновение существующих при повторном выполнении одного и того же запроса (другая транзакция добавила или удалила строки).
Уровни изоляции (от наименьшей к наибольшей):
| Уровень | Грязное чтение | Неповторяющееся чтение | Фантомное чтение | Производительность |
|---|---|---|---|---|
| READ UNCOMMITTED | ❌ Возможно | ❌ Возможно | ❌ Возможно | Высокая |
| READ COMMITTED | ✅ Запрещено | ❌ Возможно | ❌ Возможно | Средняя |
| REPEATABLE READ | ✅ Запрещено | ✅ Запрещено | ❌ Возможно* | Ниже средней |
| SERIALIZABLE | ✅ Запрещено | ✅ Запрещено | ✅ Запрещено | Низкая |
*В некоторых СУБД (например, MySQL/InnoDB) уровень REPEATABLE READ также предотвращает фантомы.
Пример установки в JDBC:
Connection conn = dataSource.getConnection();
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
Выбор уровня: READ COMMITTED — разумный баланс по умолчанию. SERIALIZABLE — для критически важных финансовых операций, где важна абсолютная согласованность.