Re: unexpected rowlock mode when trigger is on the table

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: Tomáš Záluský <zalusky(at)centrum(dot)cz>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: unexpected rowlock mode when trigger is on the table
Date: 2019-09-05 13:30:32
Message-ID: 20190905133032.GA22372@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2019-Sep-05, Tomáš Záluský wrote:

> Thanks for response.
>
> > I think there should be no overlap (PK is column "id", not modified)
>
> The update command sets the detail_id column which has unique constraint.

Oh, I see, yeah that explains it.

> What is unclear to me, why FOR NO KEY UPDATE is chosen when there is no trigger.
> Perhaps the execution path to ExecUpdateLockMode is somehow different?

heap_update on its own uses a slightly different method to determine
which columns are modified -- see HeapDetermineModifiedColumns. In this
case, since the old value is NULL and the updated value is NULL, that
function decides that the column has not changed and thus it doesn't
need the stronger lock. I bet it would work differently if you had a
different detail_id originally, or if you set it to a different value
afterwards.

> And if FOR NO KEY UPDATE is correct, how to achieve it also with trigger?

Not sure that's feasible, short of patching the Pg source.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2019-09-05 13:59:51 Re: Plug-in common/logging.h with vacuumlo and oid2name
Previous Message Alvaro Herrera 2019-09-05 13:23:11 Re: Two pg_rewind patches (auto generate recovery conf and ensure clean shutdown)