Порядок блокировок 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 шт):
Не нашел документального подтверждения, но исходя из экспериментов порядок операций следующий:
- select for no key update
- before update trigger
- update