Что такое изоляция (Isolation) в контексте транзакций баз данных?

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

Ответ

Изоляция (Isolation) — одно из четырех свойств ACID, гарантирующее, что параллельно выполняемые транзакции не влияют на целостность данных друг друга. Уровень изоляции определяет, какие аномалии чтения/записи допустимы.

Уровни изоляции (от низкого к высокому):

  1. Read Uncommitted — самый низкий уровень. Допускает грязные чтения (Dirty Reads): транзакция видит незафиксированные изменения другой транзакции.
  2. Read Committed — транзакция видит только зафиксированные данные. Исключает грязные чтения, но допускает неповторяющиеся чтения (Non-repeatable Reads): повторный запрос в той же транзакции может вернуть другие данные, если другая транзакция их зафиксировала.
  3. Repeatable Read — гарантирует, что данные, прочитанные один раз в транзакции, останутся неизменными при повторном чтении внутри этой же транзакции. Исключает неповторяющиеся чтения, но может допускать фантомные чтения (Phantom Reads): появление новых строк, удовлетворяющих условию запроса.
  4. Serializable — самый высокий уровень. Полностью изолирует транзакции, выполняя их так, как если бы они шли последовательно. Исключает все аномалии.

Практический пример (Java JDBC):

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

// Теперь в этой транзакции повторные SELECT к одной строке дадут одинаковый результат,
// даже если другая транзакция пытается ее обновить.

Почему это важно? Выбор уровня изоляции — это компромисс между целостностью данных и производительностью. Более высокие уровни снижают параллелизм, увеличивая блокировки.