PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

blocage postgres sans verrouillage explicite

Vous n'avez pas besoin de LOCK explicite entrer dans une impasse. Voici une démo très simple à partir de zéro avec uniquement des INSERT :

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

La session 1 fait :

begin;
insert into a values(1);

Alors la session #2 fait :

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

Alors la session #1 fait :

insert into b values(1);

Et puis l'impasse se produit :

La même chose peut se produire avec de simples UPDATE ou une combinaison de UPDATE et d'INSERT. Ces opérations prennent des verrous implicites, et si elles se produisent dans différentes sessions dans différents ordres, elles peuvent se bloquer.