sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan simulerer man dødvande i PostgreSQL?

  1. Åbn to forbindelser parallelt, som to forekomster af psql eller to forespørgselsvinduer i pgAdmin (hver har sin egen session).
  2. Start en transaktion i hver forbindelse. BEGIN;
  3. Kør indbyrdes modstridende kommandoer på skift.
  4. Før du kan forpligte dig, vil en af ​​de to blive rullet tilbage med en deadlock undtagelse.
  5. Du ønsker måske at rulle den anden tilbage. ROLLBACK;

Eksplicit låsning af tabeller er så simpelt som:

LOCK tbl;

Låsning af rækker kan udføres med:

SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;

Eller FOR SHARE osv. Detaljer i manualen.
(Eller implicit med UPDATE eller DELETE .)

Eksempel

Dit tilføjede eksempel kan ikke gå i stå. Begge prøver at tage den samme lås på den samme række af det samme bord først. Den anden vil vente på, at den første er færdig.

Eksempel på rent faktisk at producere en deadlock (rækker skal eksistere, ellers vil ingen lås blive taget):

Transaction 1                    Transaction 2
BEGIN;
                                 BEGIN;
SELECT salary1 
FROM   deadlock_demonstration
WHERE  worker_id = 1
FOR    UPDATE;
                                 SELECT salary1 
                                 FROM   deadlock_demonstration
                                 WHERE  worker_id = 2
                                 FOR    UPDATE;
UPDATE deadlock_demonstration
SET    salary1 = 100
WHERE  worker_id = 2;

                                 UPDATE deadlock_demonstration
                                 SET    salary1 = 100
                                 WHERE  worker_id = 1;

                    --> ... 💣 deadlock!

Resultat

OP-brugeren3388473 bidrog med dette skærmbillede efter at have verificeret løsningen:



  1. Hvordan søger man i en enum i listen over strenge efter postgresql-forespørgsel?

  2. Sådan opretter du visning i PostgreSQL

  3. Venstre JOIN hurtigere eller indre Join hurtigere?

  4. Sådan opretter du en primær nøgle i SQL