sql >> Databasteknik >  >> RDS >> PostgreSQL

postgres dödläge utan explicit låsning

Du behöver ingen explicit LOCK att hamna i ett dödläge. Här är en mycket enkel demo från början med bara INSLAG:

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

Session #1 gör:

begin;
insert into a values(1);

Då gör session #2:

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

Då gör session #1:

insert into b values(1);

Och sedan uppstår dödläget:

Samma sak kan hända med enkla UPPDATERINGAR eller en kombination av UPPDATERINGAR och INSERT. Dessa operationer kräver implicita låsningar, och om de sker i olika sessioner i olika ordningsföljder kan de låsa sig.



  1. Lägg till Ordinal Indicator till ett datum i PostgreSQL

  2. SQLException:executeQuery-metoden kan inte användas för uppdatering

  3. Rails med i minnesdatabas

  4. Kan inte hämta data från php mysql till Android-aktivitet