PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

impasse postgres sem bloqueio explícito


Você não precisa de nenhum LOCK explícito entrar em um impasse. Aqui está uma demonstração muito simples do zero com apenas INSERTs:
create table a(i int primary key);
create table b(i int primary key);

A sessão nº 1 faz:
begin;
insert into a values(1);

Então a sessão #2 faz:
begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction

Então a sessão #1 faz:
insert into b values(1);

E então ocorre o impasse:

O mesmo pode acontecer com UPDATEs simples ou uma combinação de UPDATEs e INSERTs. Essas operações recebem bloqueios implícitos e, se ocorrerem em sessões diferentes em ordens diferentes, podem ocorrer deadlock.