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

Hvornår vælger du opdateringslås og oplåsning?

Låse tages under (normalt ved eller nær begyndelsen af) en kommandos udførelse. Låse (undtagen rådgivende låse) frigives kun når en transaktion binder eller ruller tilbage. Der er ingen FOR UNLOCK , og der er heller ikke en UNLOCK kommando for at vende virkningerne af tabelniveauet LOCK kommando. Dette er alt sammen forklaret i afsnittet om samtidighedskontrol i PostgreSQL-dokumentationen.

Du skal forpligte eller rulle din transaktion tilbage for at frigive låse.

Derudover giver det ikke rigtig mening at spørge "er denne række allerede blevet slettet af en anden samtidig transaktion". Den slettes ikke rigtig, før transaktionen, der slettede rækken, commits... og selv da kan den have slettet og genindsat rækken, eller en anden samtidig transaktion kan have indsat rækken igen.

Bygger du en opgavekø eller et beskedkøsystem tilfældigt, for hvis det er tilfældet, er det problem løst, og du burde ikke forsøge at genopfinde det usædvanligt komplicerede hjul. Se PGQ, ActiveMQ, RabbitMQ, ZeroMQ osv. (Fremtidige PostgreSQL-versioner kan indeholde FOR UPDATE SKIP LOCKED da dette er ved at blive testet, men ikke er blevet frigivet i skrivende stund).

Jeg foreslår, at du poster et nyt spørgsmål med en mere detaljeret beskrivelse af det underliggende problem, du forsøger at løse. Du antager, at løsningen på dit problem er "find ud af, om rækken allerede er blevet slettet" eller "lås rækken op". Det er nok faktisk ikke løsningen. Det er lidt ligesom nogen siger "hvor køber jeg benzin", når deres push-bike ikke kører, så de går ud fra, at den er løbet tør for brændstof. Brændstof er ikke problemet, problemet er, at push-cykler ikke tager brændstof, og du skal træde i pedalerne.

Forklar baggrunden. Forklar, hvad du forsøger at opnå. Frem for alt andet, lad være med at sende pseudokode, indsend den faktiske kode, du har problemer med , helst i en selvstændig og kørebar form.




  1. Konverter effektivt rækker til kolonner i sql-server

  2. En guide til partitionering af data i PostgreSQL

  3. Oracle Regexp for at erstatte \n,\r og \t med mellemrum

  4. ORA-00942:Kan du vælge fra schema.table, men ikke tabel?