Что такое блокировки в базах данных и как они влияют на параллельную работу с данными
Что проверяют
Понимаете ли вы, зачем нужны блокировки, и знаете ли, что в PostgreSQL читатели не блокируют писателей.
Как отвечать
Блокировка это механизм, не дающий двум транзакциям одновременно изменять одни данные и получать несогласованный результат.
Виды по режиму: разделяемая (несколько транзакций читают) и исключительная (одна пишет, остальные ждут). Виды по объекту: строка, страница, таблица, а также рекомендательные блокировки уровня приложения.
Ключевая деталь для PostgreSQL: он использует MVCC, то есть каждая транзакция видит свой снимок данных. Поэтому чтение не блокирует запись, а запись не блокирует чтение. Блокируются только конкурирующие изменения одной строки. В базах на блокировках (например SQL Server по умолчанию) картина другая, и читатель может ждать писателя.
Что стоит назвать дальше:
- явные блокировки:
SELECT ... FOR UPDATE(пессимистично занять строку),FOR SHARE,LOCK TABLE; - альтернатива: оптимистичная схема с версией строки, где никто не блокируется, а конфликт обнаруживается при записи;
- взаимная блокировка: две транзакции ждут строки друг друга. PostgreSQL обнаруживает её и отменяет одну из транзакций. Лечится единым порядком захвата;
- влияние на параллелизм: чем крупнее объект блокировки и чем дольше транзакция, тем больше очередь. Отсюда правило: транзакции короткие, внешние вызовы вне транзакции,
ALTER TABLEв проде с осторожностью, потому что он берёт блокировку на всю таблицу.
Где спотыкаются
Считают, что чтение всегда блокирует запись.
Держат транзакцию открытой на время HTTP-запроса.
Не знают про обнаружение взаимных блокировок и ищут причину случайных откатов в коде.
Ставят FOR UPDATE там, где хватило бы версии строки.