Gymterview
middle

Какие уровни изоляции транзакций поддерживаются в JDBC

Уровень изолированности транзакций — это значение, определяющее степень, при которой одна транзакция изолирована от изменений, произведённых другими параллельными транзакциями.

Более высокий уровень изолированности повышает точность данных, но может снижать количество параллельно выполняемых транзакций. Более низкий уровень позволяет выполнять больше параллельных транзакций, но снижает точность данных.

Аномалии при параллельных транзакциях

  • Грязное чтение (dirty read) — чтение данных, изменённых транзакцией, которая впоследствии откатится
  • Неповторяющееся чтение (non-repeatable read) — при повторном чтении ранее прочитанные данные оказываются изменёнными
  • Фантомное чтение (phantom reads) — при повторном чтении одна и та же выборка дает разные множества строк

Уровни изоляции

Уровни определены как константы интерфейса java.sql.Connection:

Уровень Dirty Read Non-Repeatable Read Phantom Read
TRANSACTION_READ_UNCOMMITTED Да Да Да
TRANSACTION_READ_COMMITTED Нет Да Да
TRANSACTION_REPEATABLE_READ Нет Нет Да
TRANSACTION_SERIALIZABLE Нет Нет Нет

Также существует TRANSACTION_NONE — драйвер не поддерживает транзакции.

Уровень изоляции можно задать методом setTransactionIsolation() и получить через getTransactionIsolation() объекта Connection.

Не все СУБД поддерживают все уровни изоляции. Информацию о поддерживаемых уровнях можно получить через java.sql.DatabaseMetaData.

На собеседовании: нарисуйте или расскажите таблицу: какой уровень какие аномалии допускает. Самый частый вопрос — разница между READ_COMMITTED и REPEATABLE_READ. По умолчанию большинство СУБД используют READ_COMMITTED (PostgreSQL, Oracle) или REPEATABLE_READ (MySQL InnoDB).