Förstå lås och deadlocks
Lär dig om olika låstyper i PostgreSQL och hur du identifierar och förhindrar deadlocks.
Förstå lås och deadlocks är en gratis lektion i Prestandaoptimering och frågeoptimering i PostgreSQL på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Prestandaoptimering och frågeoptimering i PostgreSQL, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Prestandaoptimering och frågeoptimering i PostgreSQL innehåller totalt 4 lektioner.
Välkommen till samtidighet
När många användare eller program samtidigt kommer åt en databas kallas det samtidighet. PostgreSQL, liksom andra databaser, måste hantera dessa samtidiga operationer noggrant.
Utan korrekt hantering kan flera operationer försöka ändra samma data samtidigt, vilket leder till inkonsekvenser eller fel. Det är här lås kommer in!
Vad är databaslås?
Ett databaslås är en mekanism som styr flera transaktioners åtkomst till data. Det säkerställer att data förblir konsekventa och förhindrar konflikter.
- Dataintegritet: Garanterar att data är korrekta och tillförlitliga.
- Konsekvens: Säkerställer att transaktioner ser en konsekvent bild av databasen.
- Konfliktförebyggande: Förhindrar att olika operationer förstör data genom att försöka skriva till samma plats samtidigt.
PostgreSQL:s låslägen
PostgreSQL använder olika låslägen för att definiera vilken åtkomstnivå transaktioner har till en viss resurs. Lägena avgör kompatibiliteten: vissa tillåter delad åtkomst, medan andra är exklusiva.
- ACCESS SHARE: Erhålls av enkla
SELECT-satser. Tillåter att andra transaktioner också erhåller ACCESS SHARE, ROW SHARE och så vidare. - ROW EXCLUSIVE: Erhålls av
INSERT,UPDATEochDELETE. Tillåter samtidiga läsningar men hindrar andra transaktioner från att erhålla ROW EXCLUSIVE på samma rad. - ACCESS EXCLUSIVE: Det mest begränsande låset. Erhålls av
DROP TABLEellerTRUNCATE. Förhindrar all annan åtkomst till tabellen.
Implicit låsning i praktiken
För det mesta hämtar PostgreSQL automatiskt de lås som behövs åt er. Dessa kallas implicita lås.
Till exempel:
- När ni kör en
SELECT-fråga erhålls ett ACCESS SHARE-lås på tabellen. - När ni kör en
UPDATE-,INSERT- ellerDELETE-fråga erhålls ett ROW EXCLUSIVE-lås på de berörda raderna samt ett motsvarande lås på tabellnivå.
Denna automatiska låsning säkerställer datakonsekvens utan att ni behöver hantera den uttryckligen.
Explicit tabellåsning
Även om implicita lås hanterar de flesta fall kan ni också hämta lås explicit med kommandot LOCK TABLE. Det är användbart i specifika situationer där ni behöver styra åtkomsten mer exakt.
Ni kan ange låsläget, till exempel ACCESS EXCLUSIVE för att blockera alla andra operationer, eller SHARE för samtidig skapande av index.
Demonstration: lås en tabell
Prova att köra det här exemplet. Det skapar en enkel tabell och låser den sedan uttryckligen i läget ACCESS EXCLUSIVE. Så länge låset innehas, under transaktionens hela varaktighet, kan ingen annan transaktion läsa från eller skriva till tabellen.
CREATE TABLE IF NOT EXISTS inventory (
item_id SERIAL PRIMARY KEY,
item_name VARCHAR(100),
quantity INT
);
TRUNCATE TABLE inventory;
INSERT INTO inventory (item_name, quantity) VALUES ('Widget A', 50);
-- This command acquires an ACCESS EXCLUSIVE lock on the 'inventory' table.
-- In a real scenario, this would block other operations until committed.
LOCK TABLE inventory IN ACCESS EXCLUSIVE MODE;
SELECT 'Table locked successfully!' AS status;
-- The lock is released when this script finishes (transaction commits).Explicita radlås: SELECT FOR UPDATE
För finjusterad kontroll kan ni låsa specifika rader med SELECT FOR UPDATE eller SELECT FOR SHARE. Detta är avgörande för att förhindra kapplöpningstillstånd i programlogik.
SELECT ... FOR UPDATE: Erhåller ett ROW EXCLUSIVE-lås på de valda raderna. Andra transaktioner kan läsa raderna, men kan inte uppdatera dem eller låsa dem för uppdatering förrän er transaktion har genomförts.SELECT ... FOR SHARE: Erhåller ett ROW SHARE-lås. Andra transaktioner kan också erhålla ROW SHARE-lås, men inte ROW EXCLUSIVE.
Hitta aktiva lås med pg_locks
Om ni vill se vilka lås som för närvarande är aktiva i databasen kan ni fråga systemvyn pg_locks. Denna vy ger detaljerad information om varje lås.
Viktiga kolumner att titta efter:
pid: Process-ID:t för den process som innehar låset eller väntar på det.locktype: Typen av resurs som är låst, till exempel relation eller transactionid.mode: Låsläget, till exempel ACCESS SHARE eller ROW EXCLUSIVE.granted:tom låset innehas,fom processen väntar.
Ni kan fråga vyn så här:
SELECT * FROM pg_locks WHERE NOT granted;Förstå dödlägen
Ett dödläge uppstår när två eller fler transaktioner väntar på att varandra ska frigöra en resurs, vilket leder till ett stillestånd. Ingen av transaktionerna kan fortsätta.
PostgreSQL upptäcker automatiskt dödlägen och avbryter en av transaktionerna (det så kallade dödlägesoffret) så att den andra kan slutföras. Detta leder vanligtvis till ett felmeddelande för den avbrutna transaktionen.
Ett klassiskt dödlägesscenario
Föreställ er två transaktioner, T1 och T2, som försöker uppdatera två rader, rad A och rad B:
- T1: Låser rad A och försöker sedan låsa rad B.
- T2: Låser rad B och försöker sedan låsa rad A.
Nu innehar T1 A och väntar på B, medan T2 innehar B och väntar på A. Ingen av dem kan fortsätta. PostgreSQL upptäcker denna cykel och avslutar en av transaktionerna.
Kontroll av låslägen
Vilket låsläge erhålls vanligtvis av en enkel SELECT-sats?
Repetition: lås och dödlägen
Vi har gått igenom grunderna i databaslås och dödlägen i PostgreSQL. Lås säkerställer datakonsekvens och dataintegritet i samtidiga miljöer genom olika låslägen.
Kom ihåg:
- PostgreSQL använder implicita och explicita lås.
pg_lockshjälper er att övervaka aktiva lås.- Dödlägen uppstår när transaktioner väntar på varandra, och PostgreSQL upptäcker och löser dem genom att avbryta en transaktion.
Att förstå dessa begrepp är viktigt för att bygga robusta och högpresterande program!
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 22
- Lektioner
- 88
Vanliga frågor
Är lektionen ”Förstå lås och deadlocks” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Prestandaoptimering och frågeoptimering i PostgreSQL, inklusive ”Förstå lås och deadlocks”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Prestandaoptimering och frågeoptimering i PostgreSQL innehåller totalt 4 lektioner.
Vad lär jag mig i ”Förstå lås och deadlocks”?
Lär dig om olika låstyper i PostgreSQL och hur du identifierar och förhindrar deadlocks. Ni övar på Prestandaoptimering och frågeoptimering i PostgreSQL med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Prestandaoptimering och frågeoptimering i PostgreSQL?
Du behöver inga förkunskaper. Utbildningen i Prestandaoptimering och frågeoptimering i PostgreSQL på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Förstå lås och deadlocks”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Prestandaoptimering och frågeoptimering i PostgreSQL-lektionen?
Ja. Varje Prestandaoptimering och frågeoptimering i PostgreSQL-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Förstå lås och deadlocks
- Identifiera och lösa låskonkurrens
- Strategier för låsning på radnivå
- Advisory locks för samordning i applikationer