Как в PostgreSQL добиваются сериализуемости

«Как в PostgreSQL добиваются сериализуемости» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PostgreSQL использует механизм Snapshot Isolation (SSI) для обеспечения истинной сериализуемости. В отличие от обычного Snapshot Isolation, SSI детектирует и предотвращает аномалии, которые могут нарушить сериализуемость, такие как write skew.

Как это работает:

  1. Транзакции видят снимок данных на момент своего начала (как в обычном SI).
  2. Отслеживаются зависимости между транзакциями (чтение-запись, запись-чтение).
  3. Если обнаруживается потенциальный конфликт (например, две транзакции читают данные, а затем пишут в связанные строки), одна из них прерывается с ошибкой serialization failure.

Пример:

-- Сессия 1
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT balance FROM accounts WHERE id = 1; -- 100

-- Сессия 2
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT balance FROM accounts WHERE id = 2; -- 100

-- Сессия 1
UPDATE accounts SET balance = 150 WHERE id = 1;
COMMIT; -- Успешно

-- Сессия 2
UPDATE accounts SET balance = 50 WHERE id = 2;
COMMIT; -- Ошибка: could not serialize access due to read/write dependencies

PostgreSQL автоматически перезапускает прерванные транзакции (обычно до 3 раз).