Уровни изоляции транзакций определяют, насколько данные в одной транзакции изолированы от изменений, вносимых другими одновременными транзакциями. Они контролируют, какие типы конфликтов между транзакциями допускаются.
Стандарт SQL определяет четыре уровня изоляции:
- Read Uncommitted: Самый низкий уровень. Транзакция видит изменения, внесенные другими транзакциями, даже если эти изменения еще не зафиксированы (грязное чтение).
- Read Committed: Транзакция видит только те изменения других транзакций, которые были зафиксированы к моменту начала чтения. Предотвращает грязные чтения, но допускает неповторяющиеся чтения.
- Repeatable Read: Гарантирует, что если транзакция несколько раз читает одни и те же строки, то она видит одни и те же данные, если эти строки не были изменены ею самой. Предотвращает грязные чтения и неповторяющиеся чтения, но допускает фантомные чтения.
- Serializable: Самый высокий уровень. Транзакции выполняются таким образом, как если бы они выполнялись последовательно. Полностью исключает все аномалии: грязные чтения, неповторяющиеся чтения и фантомные чтения.
Аномалии, предотвращаемые уровнями изоляции:
| Грязное чтение | Неповторяющее чтение | Фантомное чтение |
|---|
| Read Uncommitted | Допускается | Допускается | Допускается |
| Read Committed | Нет | Допускается | Допускается |
| Repeatable Read | Нет | Нет | Допускается |
| Serializable | Нет | Нет | Нет |
- Грязное чтение (Dirty Read): Транзакция A считывает данные, которые были изменены транзакцией B, но еще не зафиксированы. Если транзакция B откатится, транзакция A будет работать с недействительными данными.
- Неповторяющееся чтение (Non-repeatable Read): Транзакция A считывает одни и те же данные дважды и видит разные значения, потому что другая транзакция B изменила и зафиксировала их между двумя чтениями в транзакции A.
- Фантомное чтение (Phantom Read): Транзакция A выполняет запрос, который возвращает набор строк. Затем другая транзакция B вставляет (или удаляет) строки, которые соответствуют условию запроса транзакции A. Если транзакция A выполнит тот же запрос снова, она увидит другой набор строк (появятся "фантомные" строки).
Выбор уровня изоляции — это компромисс между согласованностью данных и производительностью. Более высокие уровни изоляции обеспечивают большую согласованность, но могут снизить параллелизм и увеличить накладные расходы.