linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Блокировки/row-locks

kb/locks ── Блокировки ── intermediate

Блокировки строк

Блокировка строки хранится в самой строке (xmax + infomask), а не в pg_locks. Режимов четыре: FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE. Слабые нужны, чтобы внешние ключи не сериализовали вставки.

view as markdownaka: tuple-locks, for-update, select-for-update

Когда UPDATE или DELETE трогает строку, он блокирует именно её. На таблице при этом висит лёгкий ROW EXCLUSIVE, а сам замок на строку живёт в данных: номер держащей транзакции пишется в поле xmax заголовка кортежа, статус - в битах t_infomask. Поэтому блокировка строки почти бесплатна по памяти и масштабируется на миллионы строк.

Четыре режима

РежимСилаКогда
FOR KEY SHAREслабейшийудержать строку от удаления и смены ключа
FOR SHAREразделяемый«никто не изменит, пока считаю»
FOR NO KEY UPDATEсреднийUPDATE неключевых колонок
FOR UPDATEсильнейшийSELECT ... FOR UPDATE, DELETE

Зачем четыре? Из-за внешних ключей. Вставка в дочернюю таблицу должна удержать родителя от исчезновения, но не менять его. Слабый FOR KEY SHARE блокирует только удаление и смену ключа родителя, пропуская параллельный UPDATE его неключевых колонок. До версии 9.3 тут был полный конфликт, и вставки в дочернюю таблицу сериализовались зря.

Где это видно

В pg_locks отдельной строки на заблокированный кортеж нет. Ждущая транзакция видна косвенно - она стоит на locktype = 'transactionid', ожидая завершения держателя:

sql
SELECT pid, wait_event_type, wait_event
FROM pg_stat_activity WHERE wait_event_type = 'Lock';

Если одну строку держат несколько транзакций в режиме FOR SHARE, одного xmax мало - заводится multixact (запись в pg_multixact со списком участников). Его возраст отслеживает relminmxid, и он тоже требует заморозки.

Главное про порядок

Брать строки в одном порядке во всех транзакциях (например, по возрастанию ключа) - так не возникает deadlocks. Сами блокировки строк - это часть тяжёлого механизма, верхний слой которого описан в relation-locks.

§ команды

bash
SELECT * FROM bookings WHERE book_ref = '000001' FOR UPDATE;

Явно заблокировать строку под последующее изменение

bash
SELECT * FROM bookings WHERE book_ref = '000001' FOR UPDATE SKIP LOCKED;

Пропустить уже заблокированные строки - паттерн очереди задач

bash
SELECT * FROM bookings WHERE book_ref = '000001' FOR UPDATE NOWAIT;

Не ждать: если строка занята, сразу ошибка

§ см. также

  • relation-locksТяжёлые блокировки отношенийКаждая команда берёт на таблицу блокировку одного из 8 режимов: от ACCESS SHARE (обычный SELECT) до ACCESS EXCLUSIVE (DROP/ALTER), который конфликтует со всеми. Блокировка держится до конца транзакции.
  • deadlocksВзаимоблокировки (deadlock)Deadlock - цикл в графе ожидания: каждая транзакция ждёт ту, что ждёт её. PostgreSQL находит его через deadlock_timeout (1 с) и откатывает одну транзакцию с ошибкой 40P01. Лечится единым порядком блокировок.
  • idle-in-transaction-cascadeidle-in-transaction и каскад блокировокЗабытый открытый BEGIN держит блокировку до конца транзакции. Если за ним в честной FIFO-очереди встанет ALTER TABLE (ACCESS EXCLUSIVE), то даже совместимые SELECT за ним тоже повиснут - встаёт вся таблица.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки