sql >> Database >  >> RDS >> PostgreSQL

Hoe een impasse in PostgreSQL te simuleren?

  1. Open twee parallelle verbindingen, zoals twee instanties van psql of twee queryvensters in pgAdmin (elk heeft zijn eigen sessie).
  2. Start een transactie in elke verbinding. BEGIN;
  3. Voer om beurten tegenstrijdige opdrachten uit.
  4. Voordat je kunt committen, wordt een van de twee teruggedraaid met een deadlock-uitzondering.
  5. Misschien wil je de andere terugdraaien. ROLLBACK;

Expliciet tabellen vergrendelen is zo simpel als:

LOCK tbl;

Het vergrendelen van rijen kan met:

SELECT * FROM tbl WHERE boo = 3 FOR UPDATE;

Of FOR SHARE etc. Details in de handleiding.
(Of impliciet met UPDATE of DELETE .)

Voorbeeld

Uw toegevoegde voorbeeld kan niet vastlopen. Beiden proberen eerst hetzelfde slot op dezelfde rij van dezelfde tafel te pakken. De tweede wacht tot de eerste klaar is.

Voorbeeld om daadwerkelijk een deadlock te produceren (rijen moeten bestaan ​​of er wordt geen lock gebruikt):

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!

Resultaat

De OP-gebruiker 3388473 heeft deze screenshot bijgedragen na het verifiëren van de oplossing:



  1. Ontbrekende datums in PostgreSQL invullen met behulp van gene_series

  2. Foutwaarde bestaat niet - probleem postgresql INSERT INTO

  3. Lijst met mooie permalinks en posttitel exporteren

  4. Mysql inconsistent aantal rijen count(*) vs table.table_rows in information_schema