#why-mvcc
Зачем нужен MVCC? Что он даёт по сравнению с блокировкой на чтение?
Что отвечать
MVCC (multiversion concurrency control) держит несколько версий одной строки одновременно. Читатель видит снимок данных на момент начала запроса или транзакции и не ждёт писателей, а писатель не ждёт читателей. Главное правило: чтение не блокирует запись, запись не блокирует чтение. Цена - старые версии накапливаются как мусор, и его надо вычищать (этим занят vacuum). Альтернатива из старых СУБД - блокировать строку на чтение - даёт меньше мусора, но превращает конкурентную нагрузку в очередь.
Что хотят услышать
Кандидат должен: - сформулировать правило «читатели не блокируют писателей и наоборот» и понимать, что это и есть смысл многоверсионности - назвать обратную сторону: каждая старая версия живёт до очистки, поэтому MVCC и vacuum это одна тема - связать снимок с моментом времени: что увидит транзакция, зависит от уровня изоляции и от того, когда взят снимок - не путать MVCC с «отсутствием блокировок»: блокировки строк и отношений никуда не делись, MVCC снимает только конфликт чтение vs запись
Подводные камни
- ✗ Сказать «в PostgreSQL нет блокировок благодаря MVCC» - блокировки есть, MVCC убирает лишь конфликт чтения и записи
- ✗ Забыть про цену: версии копятся, и без vacuum таблица раздувается
- ✗ Думать, что читатель всегда видит самые свежие данные - он видит свой снимок, а не последнее состояние
Follow-up
- ? Почему долгая читающая транзакция мешает очистке мусора?
- ? Что в PostgreSQL всё-таки блокирует, несмотря на MVCC?
- ? Откуда берётся раздувание таблицы под нагрузкой из UPDATE?
Глубина в базе знаний