Question about tuple´s lock
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] Links: -- [1] http://www.tecnisys.com.br
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!
Re: Question about tuple´s lock
Em 24/10/2023 17:31, Tom Lane escreveu: > Carlos Alves 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