Lås tas under (vanligtvis i eller nära början av) ett kommandos exekvering. Lås (förutom rådgivande lås) frigörs endast när en transaktion binder eller rullar tillbaka. Det finns ingen FOR UNLOCK
, och det finns inte heller någon UNLOCK
kommando för att vända effekterna av LOCK
på tabellnivå kommando. Allt detta förklaras i avsnittet om samtidighetskontroll i PostgreSQL-dokumentationen.
Du måste utföra eller återställa din transaktion för att frigöra lås.
Dessutom är det inte riktigt vettigt att fråga "har den här raden redan tagits bort av en annan samtidig transaktion". Den raderas inte riktigt förrän transaktionen som tog bort raden commits... och även då kan den ha tagit bort och infogat raden igen eller en annan samtidig transaktion kan ha infogat raden igen.
Bygger du en uppgiftskö eller ett meddelandekösystem av en slump, för i så fall är det problemet löst och du borde inte försöka återuppfinna det ovanligt komplicerade hjulet. Se PGQ, ActiveMQ, RabbitMQ, ZeroMQ, etc. (Framtida PostgreSQL-versioner kan inkludera FOR UPDATE SKIP LOCKED
eftersom detta testas, men inte har släppts i skrivande stund).
Jag föreslår att du lägger upp en ny fråga med en mer detaljerad beskrivning av det underliggande problemet du försöker lösa. Du antar att lösningen på ditt problem är "ta reda på om raden redan har tagits bort" eller "lås upp raden". Det är nog inte riktigt lösningen. Det är lite som att någon säger "var köper jag bensin" när deras push-cykel inte går så de antar att det är slut på bränsle. Bränsle är inte problemet, problemet är att push-cyklar inte tar bränsle och du måste trampa på dem.
Förklara bakgrunden. Förklara vad du försöker uppnå. Framför allt annat, posta inte pseudokod, posta den faktiska koden du har problem med , helst i en fristående och körbar form.