Prestandaoptimering och frågeoptimering i PostgreSQL · Lektion

Förstå lås och deadlocks

Lär dig om olika låstyper i PostgreSQL och hur du identifierar och förhindrar deadlocks.

Lektion 1 av 412 steg

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, UPDATE och DELETE. 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 TABLE eller TRUNCATE. 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- eller DELETE-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: t om låset innehas, f om 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_locks hjä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!

Gratis att börja

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

  1. Förstå lås och deadlocks
  2. Identifiera och lösa låskonkurrens
  3. Strategier för låsning på radnivå
  4. Advisory locks för samordning i applikationer
← Tillbaka till Prestandaoptimering och frågeoptimering i PostgreSQL