Вопрос проверяет знание уровней изоляции транзакций и понимание компромиссов между консистентностью и производительностью.
SERIALIZABLE — самый строгий уровень изоляции транзакций. Он гарантирует, что результат параллельного выполнения транзакций эквивалентен их последовательному выполнению. Это устраняет все виды аномалий чтения. Цена за это — снижение производительности и возможные ошибки сериализации. Используется редко и осознанно.
Уровни изоляции определяют, как транзакции видят изменения друг друга.
SERIALIZABLE — уровень изоляции, при котором параллельные транзакции ведут себя так, как будто они выполняются строго последовательно.
Перед перечислением важно понимать, какие аномалии вообще существуют.
Dirty read
Non-repeatable read
Phantom read
SERIALIZABLE устраняет все эти проблемы.
В зависимости от СУБД используются разные механизмы.
Блокировки
Жёсткие lock’и
Ограничение параллелизма
MVCC + проверки
Проверка конфликтов при commit
Откат конфликтующих транзакций
В PostgreSQL используется второй подход.
Снижение пропускной способности
Рост числа rollback’ов
Ошибки сериализации, требующие повторного выполнения
Финансовые операции
Критичные расчёты
Инварианты, которые нельзя нарушать
SERIALIZABLE даёт максимальную корректность, но требует готовности к потерям производительности и повторным попыткам выполнения транзакций.