Ответ
Изоляция (Isolation) — одно из четырех свойств ACID, гарантирующее, что параллельно выполняемые транзакции не влияют на целостность данных друг друга. Уровень изоляции определяет, какие аномалии чтения/записи допустимы.
Уровни изоляции (от низкого к высокому):
- Read Uncommitted — самый низкий уровень. Допускает грязные чтения (Dirty Reads): транзакция видит незафиксированные изменения другой транзакции.
- Read Committed — транзакция видит только зафиксированные данные. Исключает грязные чтения, но допускает неповторяющиеся чтения (Non-repeatable Reads): повторный запрос в той же транзакции может вернуть другие данные, если другая транзакция их зафиксировала.
- Repeatable Read — гарантирует, что данные, прочитанные один раз в транзакции, останутся неизменными при повторном чтении внутри этой же транзакции. Исключает неповторяющиеся чтения, но может допускать фантомные чтения (Phantom Reads): появление новых строк, удовлетворяющих условию запроса.
- Serializable — самый высокий уровень. Полностью изолирует транзакции, выполняя их так, как если бы они шли последовательно. Исключает все аномалии.
Практический пример (Java JDBC):
// Установка уровня изоляции для соединения
Connection conn = dataSource.getConnection();
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
// Теперь в этой транзакции повторные SELECT к одной строке дадут одинаковый результат,
// даже если другая транзакция пытается ее обновить.
Почему это важно? Выбор уровня изоляции — это компромисс между целостностью данных и производительностью. Более высокие уровни снижают параллелизм, увеличивая блокировки.