Ответ
PostgreSQL использует механизм Snapshot Isolation (SSI) для обеспечения истинной сериализуемости. В отличие от обычного Snapshot Isolation, SSI детектирует и предотвращает аномалии, которые могут нарушить сериализуемость, такие как write skew.
Как это работает:
- Транзакции видят снимок данных на момент своего начала (как в обычном SI).
- Отслеживаются зависимости между транзакциями (чтение-запись, запись-чтение).
- Если обнаруживается потенциальный конфликт (например, две транзакции читают данные, а затем пишут в связанные строки), одна из них прерывается с ошибкой
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 раз).