Уровни изоляции транзакций (Isolation Level).
С базой данных может одновременно работать множество клиетов. Они могут обращаться к одинаковым таблицам, пытаться прочитать или изменить одинаковые данные, т.е. в системе одновременно может существовать множество различных транзакций (но не более одной на сессию). В связи с этим можно выделить три основные проблемы (или три феномена, как иногда это еще называют) при работе в такой многопользовательской среде. Рассмотрим их подробнее.
- Грязное чтение (dirty read) – когда одна транзакция может читать изменения сделанные другой незаконченной транзакцией. Т.е. возможен, например, такой вариант, незаконченная транзакция будет отменена, а транзакция, прочитавшая данные, ничего про это не знает. Таким образом, целостность данных не гарантируется, внешние ключи нарушаются, уникальные значения тоже не работают. Лично мне не нравится какое придумали название этому термину.
- Невоспроизводимое чтение (non-repeatable read) – когда в рамках одной транзакции результаты двух одинаковых операций чтения, сделанных в разное время, будут отличаться. Попробую объяснить проще. Например, вы прочли какую-то строку. Через некоторое время, но в этой же самой транзакции, вы еще раз читаете эту же строку, но получаете уже другое значение. Строка могла быть изменена, удалена и т.п.
- Фантомное чтение (phantom read) – когда в рамках одной транзакции могут появиться новые данные, которых не было реред этим. Например, в транзакции вы выполнили какой-то запрос, повторили его через некоторое время и получили при этом новые строки. В отличии от Невоспроизводимого чтения старые данные не изменились, зато появились новые строки, которых раньше не было. Т.е. критерию запроса теперь стало удовлетворять больше данных.
Уровни изоляции транзакций определены на основе того, допускают ли они или нет каждый из вышеуказанных феноменов. Существует 4 уровня изоляции транзакций: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Их описание приведено в таблице ниже.
Isolation Level | Dirty Read | Non-repeatable Read | Phantom Read |
READ UNCOMMITTED | Возможно | Возможно | Возможно |
READ COMMITTED | – | Возможно | Возможно |
REPEATABLE READ | – | – | Возможно |
SERIALIZABLE | – | – | – |