Re: Foreign Key locking / deadlock issue. - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Foreign Key locking / deadlock issue.
Date
Msg-id 4faf162b-5b3f-9c42-03bf-e8b61da9baef@aklaver.com
Whole thread Raw
In response to Foreign Key locking / deadlock issue.  (HORDER Phil <Phil.Horder@uk.thalesgroup.com>)
List pgsql-general
On 03/20/2018 04:46 AM, HORDER Phil wrote:
> Hi,
> 
> I’m trying to understand why I’m getting a deadlock issue, and how to 
> work around it.
> 
> At base, I think the problem is:
> 
> 1.Updates to a parent table are creating row level write locks,
> 
> 2.updates to a child table set the foreign key value to the parent 
> table, which are then blocked.
> 
> While investigating, I found the row locking documentation, which says 
> that I can request read locks that don’t block.
> 
> But my sample code still gets blocked.
> 
> https://www.postgresql.org/docs/9.6/static/explicit-locking.html
> 
> Can someone explain what I’m missing please?
> 
> parent process
> 
> -------------------
> 
> start transaction;
> 
> select * from pl where pl_id in (2,3) for no key update of pl;  (1)
> 
> update pl set m_number = '234' where pl_id = 2;                 (2)
> 
> update pl set m_number = '345' where pl_id = 3;                 (3)
> 
> child process
> 
> -------------------
> 
> start transaction;
> 
> select pl_id from pl where pl_id in (2,3) for key share of pl;  (4)
> 
> update eln set pl_id = 3 where event_id = 303;                  (5)
> 
> update eln set pl_id = 2 where event_id = 302;                  (6)


I do not see a commit for either transaction.

> 
> My Parent process inserts and updates on the PL table, but never changes 
> the key value.

I am assuming when you say key value you are referring to PRIMARY KEY?

What is the key(PK) column?

> 
> My Child process inserts and updates on the ELN table, and can set the 
> FK reference value to the PL table.
> 
> I can understand that the default lock on the PL update will block the 
> foreign key check from the ELN table.
> 
> Why does this example still get blocked?
> 
> Is there a way around this without dropping the foreign key?
> 
> (And if so…. How can I get this to work in Spring Data / JPA?)
> 
> Phil Horder
> 
> Database Mechanic
> 
> Thales
> 
> Land and Air Systems
> 
> Horizon House, Throop Road, Templecombe, Somerset, BA8 0DH, UK
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: COPY error when \. char
Next
From: Adrian Klaver
Date:
Subject: Re: error 53200 out of memory