sql >> Base de Datos >  >> RDS >> PostgreSQL

interbloqueo de postgres sin bloqueo explícito

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.