Уровни изоляции
Вопрос
Расскажи про уровни изоляции транзакций: какие аномалии они предотвращают и как это устроено в PostgreSQL.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Аномалии: dirty read, non-repeatable read, phantom read, плюс lost update и write skew
Четыре уровня стандарта и что каждый запрещает
В PostgreSQL по умолчанию Read Committed, грязного чтения нет вообще
Repeatable Read = снимок на всю транзакцию, фантомов тоже нет, при конфликте записи ошибка
Serializable (SSI) ловит write skew, приложение обязано повторять транзакцию
Чем выше уровень, тем больше откатов и повторов
Что могут спросить следом
- Какой уровень выберешь для перевода денег между счетами?
- Чем отличается Repeatable Read в MySQL и PostgreSQL?
- Как защититься от lost update без смены уровня?
Разбор
Уровни изоляции описывают, какие эффекты параллельных транзакций допустимы. Аномалии: грязное чтение, когда видим чужие незакоммиченные данные; неповторяющееся чтение, когда строка изменилась между двумя нашими чтениями; фантомы, когда по тому же условию появились новые строки. Ещё важны lost update и write skew. Стандарт даёт четыре уровня от Read Uncommitted до Serializable, каждый запрещает больше. В PostgreSQL всё на MVCC. По умолчанию Read Committed: каждый оператор видит свежий снимок. Грязного чтения нет даже на Read Uncommitted. Repeatable Read берёт один снимок на всю транзакцию, поэтому и фантомов нет, а при попытке изменить строку, которую кто-то изменил после снимка, получаем ошибку и повторяем. Serializable дополнительно отслеживает зависимости и ловит write skew. Цена высоких уровней: больше откатов, приложение обязано уметь повторять транзакцию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Advisory-блокировки в PostgreSQL
- Как избежать deadlock при переводах
- Взаимоблокировки: как ловить и предотвращать
- Долгая транзакция и раздувание таблиц
- MVCC и VACUUM в PostgreSQL
- VACUUM или VACUUM FULL на проде
- Зачем нужна заморозка и что такое wraparound
- Что делает PostgreSQL при deadlock