Порядок блокировок postgresql при наличии before триггеров

Сценарий: есть таблица, в которой происходит UPDATE строки. Так же в этой таблице есть построчный триггер BEFORE UPDATE, который в начале своей работы применяет pg_advisory_xact_lock.

Вопрос: какая блокировка применяется первой? Блокировка for no key update от самой операции UPDATE? Или pg_advisory_xact_lock?

Согласно документации Postgresql "Триггеры BEFORE уровня оператора срабатывают до того, как оператор начинает делать что-либо". Что заставляет думать, что сначала должна примениться блокировка pg_advisory_xact_lock.

Но проведя эксперимент: в параллельной транзакции вручную применил сначала pg_advisory_xact_lock, а потом for no key update и после попытался сделать UPDATE строки со срабатыванием триггера. Получил результат, что вторая транзакция была отменена из-за не получения блокировки именно записи таблицы, а не рекомендательной блокировки. Что указывает на то, что сначала получается блокировка строки, а уже потом исполнение триггера.

Но я не нашел в документации подтверждения результатов моего эксперимента. Знает ли кто-нибуть где можно прочитать про порядок операций в данном сценариии?


Ответы (1 шт):

Автор решения: Андрей

Не нашел документального подтверждения, но исходя из экспериментов порядок операций следующий:

  1. select for no key update
  2. before update trigger
  3. update

Эксперимент

→ Ссылка