SELECT FOR UPDATE в PostgreSQL на самом деле выполняет запись.На heap-странице Postgres у каждого tuple есть заголовок с метаданными этой записи.
Когда транзакция выполняет
SELECT FOR UPDATE, у найденных строк обновляется заголовок: они помечаются как заблокированные, а в xmax записывается идентификатор транзакции, которая установила блокировку.В частности, в заголовке
infomask выставляются два бита:HEAP_XMAX_EXCL_LOCK и HEAP_XMAX_LOCK_ONLY.Из-за этого страница становится dirty, а изменение также попадает в WAL. Позже WAL может быть отправлен на standby-реплику.
Сама dirty-страница затем может быть сброшена на диск фоновым процессом.
После коммита блокировка снимается.
Забавно, что операция чтения в итоге может вызвать целую цепочку операций записи на диск.
раться с новой возможностью.
👉 Java Portal

