PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Deadlock ohne explizites Sperren

Sie brauchen kein explizites LOCK in eine Sackgasse geraten. Hier ist eine sehr einfache Demo von Grund auf mit nur INSERTs:

create table a(i int primary key);
create table b(i int primary key);

Sitzung #1 tut:

begin;
insert into a values(1);

Dann tut Sitzung Nr. 2:

begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction

Dann tut Sitzung Nr. 1:

insert into b values(1);

Und dann tritt der Deadlock auf:

Dasselbe könnte mit einfachen UPDATEs oder einer Kombination aus UPDATEs und INSERTs passieren. Diese Operationen nehmen implizite Sperren, und wenn sie in verschiedenen Sitzungen in unterschiedlicher Reihenfolge auftreten, können sie Deadlocks verursachen.