Уровни изоляции транзакций. Модели конкурентного доступа.
PostgreSQL поддерживает несколько уровней изоляции, которые определяют, как транзакции видят изменения других транзакций. Уровни изоляции регулируют конкурентный доступ к данным.
⸻
Уровни изоляции
- Read Uncommitted (Чтение незафиксированных данных)
- Самый низкий уровень изоляции.
- Транзакции могут видеть незафиксированные изменения других транзакций.
- Read Committed (Чтение зафиксированных данных)
- Транзакции видят только зафиксированные изменения.
- Уровень по умолчанию в PostgreSQL.
- Repeatable Read (Повторяемое чтение)
- Гарантирует, что данные, прочитанные в транзакции, не изменятся другими транзакциями до ее завершения.
- Полезно для предотвращения фантомного чтения.
- Serializable (Сериализуемый)
- Самый строгий уровень изоляции.
- Гарантирует, что параллельные транзакции выполняются так, как если бы они шли последовательно.
| Уровень изоляции | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| Read Uncommitted | ❌ | ❌ | ❌ |
| Read Committed | ✅ | ❌ | ❌ |
| Repeatable Read | ✅ | ✅ | ❌ |
| Serializable | ✅ | ✅ | ✅ |
Dirty Read (Грязное чтение) — транзакция читает незафиксированные изменения другой транзакции. Если та откатится, данные окажутся неверными.
Non-Repeatable Read (Неповторяемое чтение) — данные, прочитанные транзакцией, могут измениться другой транзакцией до её завершения.
Phantom Read (Фантомное чтение) — при повторном выполнении запроса могут появляться или исчезать новые строки, добавленные или удалённые другими транзакциями.
Пример установки уровня изоляции:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Операции внутри транзакции
SELECT * FROM accounts WHERE user_id = 1;
COMMIT;
⸻
Модели конкурентного доступа
- Оптимистический (версионированный)
- Проверка конфликтов после выполнения действия.
- Пример: пользователь изменяет данные и пытается сохранить изменения. Если версия данных совпадает с текущей — операция проходит, иначе — конфликт, который обрабатывается повторным выполнением или откатом.
- Пессимистический (с блокировками)
- Проверка конфликтов до выполнения действия.
- Потоки сериализуются на защищаемой области данных (блокируются).
- Частично-оптимистический (смешанный)
- Комбинирует оба подхода: часть операций проверяется заранее, часть — после выполнения.
No comments to display
No comments to display