Lukkojen ja umpikujien ymmärtäminen
Opettele PostgreSQL:n eri lukkotyypit sekä se, miten umpikujia tunnistetaan ja ehkäistään.
Lukkojen ja umpikujien ymmärtäminen on ilmainen PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PostgreSQL:n suorituskyky ja kyselyjen optimointi-kurssilla on yhteensä 4 oppituntia.
Tervetuloa samanaikaisuuden pariin
Kun useat käyttäjät tai sovellukset käyttävät tietokantaa samanaikaisesti, puhutaan samanaikaisuudesta. PostgreSQL:n, kuten muidenkin tietokantojen, on hallittava nämä samanaikaiset toiminnot huolellisesti.
Ilman asianmukaista hallintaa useat toiminnot saattaisivat yrittää muokata samoja tietoja yhtä aikaa, mikä voisi johtaa ristiriitoihin tai virheisiin. Tässä tarvitaan lukituksia!
Mitä tietokannan lukitukset ovat?
Tietokannan lukitus on mekanismi, joka hallitsee useiden tapahtumien pääsyä tietoihin. Se varmistaa tietojen yhdenmukaisuuden ja estää ristiriidat.
- Tietojen eheys: Takaa, että tiedot ovat täsmällisiä ja luotettavia.
- Yhdenmukaisuus: Varmistaa, että tapahtumat näkevät tietokannasta yhdenmukaisen näkymän.
- Ristiriitojen estäminen: Estää eri toimintoja turmelemasta tietoja yrittämällä kirjoittaa samaan paikkaan samanaikaisesti.
PostgreSQL:n lukitustilat
PostgreSQL käyttää erilaisia lukitustiloja määrittämään, millainen pääsy tapahtumilla on tiettyyn resurssiin. Tilat määrittävät yhteensopivuuden: jotkin sallivat jaetun käytön, kun taas toiset ovat yksinomaisia.
- ACCESS SHARE: Yksinkertaiset
SELECT-lauseet hankkivat tämän lukituksen. Se sallii myös muiden tapahtumien hankkia ACCESS SHARE-, ROW SHARE- ja muita lukituksia. - ROW EXCLUSIVE: Komennot
INSERT,UPDATEjaDELETEhankkivat tämän lukituksen. Se sallii samanaikaiset lukutoiminnot, mutta estää muita tapahtumia hankkimasta ROW EXCLUSIVE -lukitusta samoille riveille. - ACCESS EXCLUSIVE: Rajoittavin lukitus. Komennot
DROP TABLEjaTRUNCATEhankkivat tämän lukituksen. Se estää kaiken muun pääsyn tauluun.
Implisiittiset lukitukset käytännössä
Useimmiten PostgreSQL hankkii tarvittavat lukitukset automaattisesti puolestanne. Näitä kutsutaan implisiittisiksi lukituksiksi.
Esimerkiksi:
- Kun suoritatte
SELECT-kyselyn, tauluun hankitaan ACCESS SHARE -lukitus. - Kun suoritatte
UPDATE-,INSERT- taiDELETE-kyselyn, käsiteltäviin riveihin hankitaan ROW EXCLUSIVE -lukitus ja vastaava taulutason lukitus.
Tämä automaattinen lukitseminen varmistaa tietojen yhdenmukaisuuden ilman, että sitä tarvitsee hallita erikseen.
Eksplisiittiset taululukitukset
Vaikka implisiittiset lukitukset kattavat useimmat tilanteet, voitte hankkia lukituksia myös eksplisiittisesti komennolla LOCK TABLE. Tästä on hyötyä tilanteissa, joissa pääsyä on hallittava tarkemmin.
Voitte määrittää lukitustilan, kuten ACCESS EXCLUSIVE kaikkien muiden toimintojen estämiseksi tai SHARE samanaikaista indeksin luomista varten.
Esimerkki: taulun lukitseminen
Kokeilkaa tämän esimerkin suorittamista. Se luo yksinkertaisen taulun ja lukitsee sen sitten eksplisiittisesti tilassa ACCESS EXCLUSIVE. Kun tämä lukitus on voimassa tapahtuman ajan, mikään muu tapahtuma ei voi lukea tästä taulusta tai kirjoittaa siihen.
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).Eksplisiittiset rivilukitukset: SELECT FOR UPDATE
Hienojakoista hallintaa varten voitte lukita tiettyjä rivejä komennolla SELECT FOR UPDATE tai SELECT FOR SHARE. Tämä on olennaista kilpailutilanteiden estämiseksi sovelluslogiikassa.
SELECT ... FOR UPDATE: Hankkii valituille riveille ROW EXCLUSIVE -lukituksen. Muut tapahtumat voivat lukea näitä rivejä, mutta ne eivät voi päivittää rivejä tai lukita niitä päivitystä varten ennen tapahtuman vahvistamista.SELECT ... FOR SHARE: Hankkii ROW SHARE -lukituksen. Myös muut tapahtumat voivat hankkia ROW SHARE -lukituksia, mutta eivät ROW EXCLUSIVE -lukituksia.
Aktiivisten lukitusten tarkasteleminen pg_locks-näkymän avulla
Nähdäksenne tietokannassa tällä hetkellä aktiiviset lukitukset voitte tehdä kyselyn järjestelmänäkymään pg_locks. Tämä näkymä tarjoaa yksityiskohtaisia tietoja kustakin lukituksesta.
Tärkeät tarkasteltavat sarakkeet:
pid: Lukitusta hallussaan pitävän tai sitä odottavan prosessin tunnus.locktype: Lukittavan resurssin tyyppi (esimerkiksi relation tai transactionid).mode: Lukitustila (esimerkiksi ACCESS SHARE tai ROW EXCLUSIVE).granted:t, jos lukitus on myönnetty, jaf, jos sitä odotetaan.
Voitte tehdä kyselyn näin:
SELECT * FROM pg_locks WHERE NOT granted;Lukkiutumistilanteiden ymmärtäminen
Lukkiutuminen tapahtuu, kun vähintään kaksi tapahtumaa odottaa toistensa vapauttavan resurssin, jolloin kaikki pysähtyy. Kumpikaan tapahtuma ei voi jatkaa.
PostgreSQL tunnistaa lukkiutumiset automaattisesti ja keskeyttää yhden tapahtumista (”lukkiutumisen uhrin”), jotta toinen voi valmistua. Keskeytetylle tapahtumalle ilmoitetaan yleensä virheestä.
Klassinen lukkiutumistilanne
Kuvitellaan kaksi tapahtumaa, T1 ja T2, jotka yrittävät päivittää kahta riviä, riviä A ja riviä B:
- T1: Lukitsee rivin A ja yrittää sitten lukita rivin B.
- T2: Lukitsee rivin B ja yrittää sitten lukita rivin A.
Tässä vaiheessa T1 pitää lukittuna riviä A ja odottaa riviä B, kun taas T2 pitää lukittuna riviä B ja odottaa riviä A. Kumpikaan ei voi edetä. PostgreSQL havaitsee tämän kehän ja lopettaa toisen tapahtuman.
Lukitustilan tarkistus
Minkä lukitustilan yksinkertainen SELECT-lause tyypillisesti hankkii?
Kertaus: lukitukset ja lukkiutumiset
Olemme käsitelleet PostgreSQL:n tietokannan lukitusten ja lukkiutumisten perusteet. Lukitukset varmistavat tietojen yhdenmukaisuuden ja eheyden samanaikaisissa ympäristöissä eri lukitustilojen avulla.
Muistakaa:
- PostgreSQL käyttää implisiittisiä ja eksplisiittisiä lukituksia.
pg_locksauttaa seuraamaan aktiivisia lukituksia.- Lukkiutumisia syntyy, kun tapahtumat odottavat toisiaan, ja PostgreSQL tunnistaa ja ratkaisee ne keskeyttämällä yhden tapahtuman.
Näiden käsitteiden ymmärtäminen on tärkeää vakaiden ja suorituskykyisten sovellusten rakentamisessa!
Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 22
- Oppitunnit
- 88
Usein kysytyt kysymykset
Onko oppitunti ”Lukkojen ja umpikujien ymmärtäminen” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolun 3 oppituntia, myös oppitunnin “Lukkojen ja umpikujien ymmärtäminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. PostgreSQL:n suorituskyky ja kyselyjen optimointi-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Lukkojen ja umpikujien ymmärtäminen”?
Opettele PostgreSQL:n eri lukkotyypit sekä se, miten umpikujia tunnistetaan ja ehkäistään. Harjoittelet PostgreSQL:n suorituskyky ja kyselyjen optimointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni PostgreSQL:n suorituskyky ja kyselyjen optimointi-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Lukkojen ja umpikujien ymmärtäminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppitunnilla?
Kyllä. Jokainen PostgreSQL:n suorituskyky ja kyselyjen optimointi-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Lukkojen ja umpikujien ymmärtäminen
- Lukituskilpailun tunnistaminen ja ratkaiseminen
- Rivitason lukituksen strategiat
- Neuvottelevat lukot sovellusten koordinointiin