RE: Foreign Key locking / deadlock issue.... v2

From: HORDER Phil <Phil(dot)Horder(at)uk(dot)thalesgroup(dot)com>
To: rob stone <floriparob(at)gmail(dot)com>, pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: RE: Foreign Key locking / deadlock issue.... v2
Date: 2018-03-23 15:42:09
Message-ID: 1fb8c9f3a51847cc81a4f2774849e869@XEXWIN0001.one-02-priv.grp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Rob, thanks for looking.

The "pause" is only to not-do-the-commit yet, so that the child process can then try and access the record - I've not left anything out.

This code is my own demo, not a cut from our production code.

Did you run this as the 'postgres' superuser? That would bypass the RLS, and probably avoid the problem.

I checked by creating a new user, and ran my code in that:

Sql> create user test password 'password';

After running my test script, psql \dp shows:

Schema | Name | Type | Access privileges | Column privileges | Policies

--------+-------------------+-------+---------------------------------+-------------------+------------------

public | eln | table | | |

public | pl | table | | | security_policy:+

| | | | | (u): true +

| | | | | (c): true

(plus some other stuff for postGIS)

Here’s my code again:

drop table if exists ELN;

drop table if exists PL;

Create table PL

(pl_id integer,

m_number text

);

alter table PL ENABLE row level security;

alter table PL FORCE row level security;

drop policy if exists security_policy on PL ;

CREATE POLICY security_policy on PL FOR ALL TO PUBLIC USING (true) WITH CHECK (true);

Alter table PL add constraint PL_PK primary key (pl_id);

Insert into PL values (1, null);

Insert into PL values (2, null);

Insert into PL values (3, null);

Create table ELN

(event_id integer,

pl_id integer

);

Alter table ELN add constraint ELN_PK primary key (event_id);

Alter table ELN add constraint ELN_PL_FK foreign key (pl_id) references PL (pl_id);

Insert into ELN values (301, null);

Insert into ELN values (302, null);

Insert into ELN values (303, null);

commit;

-- process 1:

start transaction;

update pl set m_number = '234' where pl_id = 2;

update pl set m_number = '345' where pl_id = 3;

-- wait here, and run process 2

commit;

-- process 2:

start transaction;

update eln set pl_id = 3 where event_id = 303;

update eln set pl_id = 2 where event_id = 302;

-- Gets blocked by process 1

commit;

Phil Horder

Database Mechanic

-----Original Message-----
From: rob stone [mailto:floriparob(at)gmail(dot)com]
Sent: 23 March 2018 11:43
To: HORDER Phil; pgsql-general
Subject: Re: Foreign Key locking / deadlock issue.... v2

Hello Phil,

I've run your sample script on 9.6.5 and 10.3.

The only thing that I added was a commit; after the initial inserts just to ensure the rows were saved.

No errors were reported for either version.

The output of \dp after running was:-

Access privileges Schema | Name | Type | Access privileges | Column privileges

| Policies

--------+------+-------+-------------------+-------------------+-------

-----------

public | eln | table | | |

public | pl | table | | |

security_policy:+

| | | | | (u):

true

--> including the FOR ALL in the create policy statement as well as

WITH CHECK(true).

Access privileges Schema | Name | Type | Access privileges | Column privileges

| Policies

--------+------+-------+-------------------+-------------------+-------

-----------

public | eln | table | | |

public | pl | table | | |

security_policy:+

| | | | | (u):

true +

| | | | | (c):

true

The only mystery is what happens here:-

<snip>

-- …. Pause while other processing happens …..

(commit;)

-- Child table processing – occurs often & quickly. Starts after parent update.

<\snip>

I'd like to know more about RLS and trying to de-bug your script.

On a production application you'd be testing for errors and raising exceptions so as to inform users that a problem occurred.

So, without knowing what occurs during "Pause while other processing happens" I can't help any further.

Cheers,

Rob

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Dave Cramer 2018-03-23 17:12:26 Re: JDBC connectivity issue
Previous Message JCMS22 2018-03-23 14:24:28 Re: JDBC connectivity issue