Question about tuple´s lock

Started by Carlos Alvesover 2 years ago4 messagesgeneral
Jump to latest
#1Carlos Alves
carlos.alves@tecnisys.com.br

Hi!

I need some help to understand why a transaction wiht a row delete
aquire a AccessExclusiveLock and a row update a ExclusiveLock.

To ilustrate, a made this scenario:

create table tblock

(

id int primary key,

value text

);

insert into tblock values (1, 'somevalue');

First start Transaction 1:

begin;

update tblock set value = 'othervalue' where id = 1;

-- keep this transaction opened

After, start Transaction 2:

begin;

update tblock set value = 'onemorevalue' where id = 1;

-- at this point, this transaction assumes a ExclusiveLock in the tuple;

-- keep this transaction opend

Then, start Transaction 3:

begin;

update tblock set value = 'lastofthevalues' where id = 1;

-- here i can see this transaction trying to aquire a
AccessExclusiveLock in this tuple

So, my question is: why a delete row requires a AccessExclusiveLock in
the tuple insteead of ExclusiveLock?

Bellow, a image of a query over pg_locks:

PostgreSQL version: 13

OS: Centos 7

Thanks in advance.

--

Carlos Alves
Especialista

Sia Trecho 08, lotes 245 / 255 / 265 || +55 (61) 3039-9700
71205-080 || Guará || Brasília, DF 0800-6020097

www.tecnisys.com.br [1]http://www.tecnisys.com.br

Links:
------
[1]: http://www.tecnisys.com.br

Attachments:

b9879537.pngimage/png; name=b9879537.pngDownload+2-0
f62593aa.gifimage/gif; name=f62593aa.gifDownload
04237a95.gifimage/gif; name=04237a95.gifDownload
#2Carlos Alves
carlos.alves@tecnisys.com.br
In reply to: Carlos Alves (#1)
Re: Question about tuple´s lock

Em 24/10/2023 13:27, Carlos Alves escreveu:

Hi!

I need some help to understand why a transaction wiht a row delete aquire a AccessExclusiveLock and a row update a ExclusiveLock.

To ilustrate, a made this scenario:

create table tblock

(

id int primary key,

value text

);

insert into tblock values (1, 'somevalue');

First start Transaction 1:

begin;

update tblock set value = 'othervalue' where id = 1;

-- keep this transaction opened

After, start Transaction 2:

begin;

update tblock set value = 'onemorevalue' where id = 1;

-- at this point, this transaction assumes a ExclusiveLock in the tuple;

-- keep this transaction opend

Then, start Transaction 3:

begin;

update tblock set value = 'lastofthevalues' where id = 1;

-- here i can see this transaction trying to aquire a AccessExclusiveLock in this tuple

So, my question is: why a delete row requires a AccessExclusiveLock in the tuple insteead of ExclusiveLock?

Bellow, a image of a query over pg_locks:

PostgreSQL version: 13

OS: Centos 7

Thanks in advance.

I typed the last command wrong. Should be:

Transaction 3:

begin;

delete from tblock where id = 1;

Sorry!

Attachments:

b9879537.pngimage/png; name=b9879537.pngDownload+2-0
f62593aa.gifimage/gif; name=f62593aa.gifDownload
04237a95.gifimage/gif; name=04237a95.gifDownload
#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Carlos Alves (#1)
Re: Question about tuple´s lock

Carlos Alves <carlos.alves@tecnisys.com.br> writes:

I need some help to understand why a transaction wiht a row delete
aquire a AccessExclusiveLock and a row update a ExclusiveLock.

UPDATE can use the weaker lock type if it's not modifying any
column that is part of a unique index. This is to allow concurrency
with foreign-key checks that might wish to grab a read-only (shared)
lock on such a tuple.

A DELETE, or an UPDATE that is modifying key columns, has to
conflict with foreign-key checks.

regards, tom lane

#4Carlos Alves
carlos.alves@tecnisys.com.br
In reply to: Tom Lane (#3)
Re: Question about tuple´s lock

Em 24/10/2023 17:31, Tom Lane escreveu:

Carlos Alves <carlos.alves@tecnisys.com.br> writes:

I need some help to understand why a transaction wiht a row delete
aquire a AccessExclusiveLock and a row update a ExclusiveLock.

UPDATE can use the weaker lock type if it's not modifying any
column that is part of a unique index. This is to allow concurrency
with foreign-key checks that might wish to grab a read-only (shared)
lock on such a tuple.

A DELETE, or an UPDATE that is modifying key columns, has to
conflict with foreign-key checks.

regards, tom lane

Tom,

thank you very much for your straight to the point answer!

regards
Carlos Alves