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.