No necesitas ningún LOCK
explícito entrar en un callejón sin salida. Aquí hay una demostración muy simple desde cero con solo INSERT:
create table a(i int primary key);
create table b(i int primary key);
La sesión #1 hace:
begin;
insert into a values(1);
Entonces la sesión #2 hace:
begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction
Entonces la sesión #1 hace:
insert into b values(1);
Y luego se produce el interbloqueo:
Lo mismo podría suceder con ACTUALIZACIONES simples o una combinación de ACTUALIZACIONES e INSERCIONES. Estas operaciones toman bloqueos implícitos y, si ocurren en diferentes sesiones en diferentes órdenes, pueden bloquearse.