PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

postgres deadlock senza blocco esplicito

Non hai bisogno di alcun LOCK esplicito entrare in una situazione di stallo. Ecco una demo molto semplice da zero con solo INSERT:

create table a(i int primary key);
create table b(i int primary key);

La sessione n. 1 fa:

begin;
insert into a values(1);

Quindi la sessione n. 2 fa:

begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction

Quindi la sessione n. 1 fa:

insert into b values(1);

E poi si verifica il deadlock:

Lo stesso potrebbe accadere con semplici UPDATE o una combinazione di UPDATE e INSERT. Queste operazioni accettano blocchi impliciti e, se si verificano in sessioni diverse in ordini diversi, potrebbero verificarsi in deadlock.