Какие уровни изоляции транзакций поддерживаются в 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).