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