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.