Skip to main content

Уровни изоляции транзакций. Модели конкурентного доступа.

PostgreSQL поддерживает несколько уровней изоляции, которые определяют, как транзакции видят изменения других транзакций. Уровни изоляции регулируют конкурентный доступ к данным.

Уровни изоляции

  1. Read Uncommitted (Чтение незафиксированных данных)
    • Самый низкий уровень изоляции.
    • Транзакции могут видеть незафиксированные изменения других транзакций.
  2. Read Committed (Чтение зафиксированных данных)
    • Транзакции видят только зафиксированные изменения.
    • Уровень по умолчанию в PostgreSQL.
  3. Repeatable Read (Повторяемое чтение)
    • Гарантирует, что данные, прочитанные в транзакции, не изменятся другими транзакциями до ее завершения.
    • Полезно для предотвращения фантомного чтения.
  4. 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;

Модели конкурентного доступа

  1. Оптимистический (версионированный)
    • Проверка конфликтов после выполнения действия.
    • Пример: пользователь изменяет данные и пытается сохранить изменения. Если версия данных совпадает с текущей — операция проходит, иначе — конфликт, который обрабатывается повторным выполнением или откатом.
  2. Пессимистический (с блокировками)
    • Проверка конфликтов до выполнения действия.
    • Потоки сериализуются на защищаемой области данных (блокируются).
  3. Частично-оптимистический (смешанный)
    • Комбинирует оба подхода: часть операций проверяется заранее, часть — после выполнения.