sql >> Database >  >> RDS >> PostgreSQL

Wanneer selecteert voor update vergrendelen en ontgrendelen?

Sloten worden genomen tijdens (meestal aan of nabij het begin van) de uitvoering van een commando. Vergrendelingen (behalve adviserende vergrendelingen) worden alleen vrijgegeven wanneer een transactie wordt vastgelegd of teruggedraaid. Er is geen FOR UNLOCK , noch is er een UNLOCK commando om de effecten van LOCK op tabelniveau ongedaan te maken opdracht. Dit wordt allemaal uitgelegd in het gedeelte over gelijktijdigheidscontrole van de PostgreSQL-documentatie.

U moet uw transactie vastleggen of terugdraaien om vergrendelingen te ontgrendelen.

Bovendien heeft het niet echt zin om te vragen "is deze rij al verwijderd door een andere gelijktijdige transactie". Het wordt niet echt verwijderd totdat de transactie die de rij heeft verwijderd, wordt vastgelegd... en zelfs dan kan het de rij hebben verwijderd en opnieuw ingevoegd of een andere gelijktijdige transactie heeft de rij mogelijk opnieuw ingevoegd.

Bouw je toevallig een takenwachtrij of berichtenwachtrijsysteem, want als dat zo is, is dat probleem opgelost en moet je niet proberen dat ongewoon ingewikkelde wiel opnieuw uit te vinden. Zie PGQ, ActiveMQ, RabbitMQ, ZeroMQ, enz. (Toekomstige PostgreSQL-versies kunnen FOR UPDATE SKIP LOCKED bevatten aangezien dit wordt getest, maar nog niet is vrijgegeven op het moment van schrijven).

Ik stel voor dat je een nieuwe vraag plaatst met een meer gedetailleerde beschrijving van het onderliggende probleem dat je probeert op te lossen. U gaat ervan uit dat de oplossing voor uw probleem is "uitzoeken of de rij al is verwijderd" of "de rij ontgrendelen". Dat is waarschijnlijk niet echt de oplossing. Het is een beetje zoals iemand die zegt "waar koop ik benzine" wanneer hun duwfiets niet gaat, zodat ze aannemen dat de brandstof op is. Brandstof is niet het probleem, het probleem is dat duwfietsen geen brandstof verbruiken en je moet ze trappen.

Leg de achtergrond uit. Leg uit wat je probeert te bereiken. Plaats vooral geen pseudocode, plaats de daadwerkelijke code waarmee u problemen ondervindt , bij voorkeur in een op zichzelf staande en uitvoerbare vorm.




  1. Hoe kan ik meerdere kolommen SELECTEREN binnen een CASE WHEN op SQL Server?

  2. Relationele versus niet-relationele databases - Deel 1

  3. Optimale manier om gespecificeerde rijen te VERWIJDEREN uit Oracle

  4. Doel van het gebruik van verschillende soorten PL/SQL-verzamelingen in Oracle