Tutustu lukitukseen

Valmis

MVCC (Multi-Version Concurrency Control) tarjoaa sopivat samanaikaisuusasetukset useimpiin tilanteisiin. Jos sovellus kuitenkin edellyttää tiettyjä lukituksia, jotka ohjaavat tarkasti, mitä rivejä tämä koskee, ja tietyllä lukitustasolla, eksplisiittiset lukitustilat mahdollistavat tämän hienorakeisen ohjausobjektin.

PostgreSQL:n Azure-tietokannassa on kolmentyyppisiä eksplisiittisiä lukituksia, taulukkotason lukituksia, rivitason lukituksia ja sivutason lukituksia. Alkuperäisessä tapahtumassa pyydetään lukitusta, ja jos se hyväksytään, pyydetystä lukosta tulee olemassa oleva lukitus. Jos toinen tapahtuma yrittää ottaa käyttöön samojen tietojen lukituksen, lukitus myönnetään, jos se ei ole ristiriidassa alkuperäisen tapahtuman kanssa.

Esimerkiksi kaksi tapahtumaa voi tehdä kyselyn samoihin tietoihin samanaikaisesti SELECT-lausekkeella. Näissä pyynnöissä käytetään ACCESS SHARE -lukitusta, ja molemmat sallitaan. Toisessa skenaariossa yksi tapahtuma on tietojen kyseleminen SELECT-lauseella ja ACCESS-JAkolukolla, mutta samalla toinen tapahtuma yrittää pudottaa saman taulukon. Taulukon pudottaminen edellyttää EXCLUSIVE-käyttöoikeutta, jota ei myönnetä tässä skenaariossa.

Taulukkotason lukot

Taulukkotason lukitukset hankkivat lukitukset koko taulukkoon, vaikka niiden nimessä olisi RIVI. Koko taulukon lukitus saattaa olla tarpeen, jos itse taulukkoa muokataan tai se voi olla tehokkaampaa kuin useiden rivitason lukitusten poistaminen.

Azure Database for PostgreSQL:ssä on kahdeksan taulukkotason lukitustyyppiä, ja tämäntyyppiset lukot saavat SQL-komennot:

Lukitustila Hankkinut
KÄYTÄ JAKOA SELECT-komento
RIVIN JAKAMINEN VALITSE PÄIVITÄ- JA VALITSE JAA-komentoJA VARTEN
RIVI POIS SULKEVANA UPDATE-, DELETE- ja INSERT-komennot
JAA PÄIVITYS POIS SULKEVANA ANALYSOI, LUO INDEKSI SAMANAIKAISESTI, LUO TILASTOTIETOJA, KOMMENTOI, REINDEX CONCURRENTLY -komennoT, JOTKIN ALTER INDEX- JA ALTER TABLE -komennot ja VACUUM (EI TÄYTTÄ)
JAKAA CREATE INDEX (not CONCURRENTLY) -komento
JAA RIVI POIS SULKEVANA CREATE TRIGGER -komento ja joitakin ALTER TABLE -komentoja
YKSINOMAINEN PÄIVITÄ MUODOSTETTU NÄKYMÄ SAMANAIKAISESTI -komento
KÄYTTÖ YKSINOIKEUDELLA DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (not CONCURRENTLY) -komennot, useimmat ALTER INDEX- ja ALTER TABLE -komennot ja VACUUM FULL

Kaikki olemassa olevien lukituslohkojen tyypit hankkivat muita pyydettyjä lukituksia. Seuraavassa taulukossa luetellaan, mitkä lukitukset estävät muiden lukitusten hankkimisen:

-- AIEMMIN LUOTU KÄYTTÖOIKEUSRESURSSI AIEMMIN LUOTU RIVIRESURSSI AIEMMIN LUOTU RIVI EKSKLUSIIVISET AIEMMIN LUOTU JAKOPÄIVITYS EKSKLUSIIVISET Aiemmin luotu JAKO AIEMMIN LUOTU JAKORIVI EXCL AIEMMIN LUOTU EXCLUSIVE OLEMASSA OLEVA KÄYTTÖ YKSINOIKEUDELLA
Pyydetty KÄYTTÖOIKEUSOSUUS Tukossa
Pyydetty RIVIOSUUS Tukossa Tukossa
PYYDETTY RIVI POIS SULKEVANA Tukossa Tukossa Tukossa Tukossa
PYYDETTY JAKOPÄIVITYS EKSKLUSIIVISEN Tukossa Tukossa Tukossa Tukossa Tukossa
Pyydetty JAKO Tukossa Tukossa Tukossa Tukossa Tukossa
Pyydetty JAKORIVI EKSKLUSIIVISIA Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa
Pyydetty EKSKLUSIIVISTA Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa
PYYDETTY KÄYTTÖ YKSINOIKEUDELLA Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa Tukossa

Rivitason lukot

Rivitason lukot ovat rakeisempia ja vaikuttavat vain toiseen tapahtumaan, joka käyttää samaa riviä. Tämä lukitustyyppi parantaa samanaikaiuutta, mutta useiden lukitusten hankkiminen ja pudottaminen vaikuttaa haitallisesti suorituskykyyn. PostgreSQL hankkii rivitason lukot automaattisesti, eikä niitä käytetä manuaalisesti.

Azure Database for PostgreSQL:lle on neljä rivitason lukitustyyppiä, jotka hankitaan sen mukaan, mitkä muut lukitustyypit on estettävä:

-- AIEMMIN LUOTU AVAINRESURSSI AIEMMIN LUOTU JAETULLE AIEMMIN LUOTU AVAINPÄIVITYSTÄ VARTEN AIEMMIN LUOTU PÄIVITYSTÄ VARTEN
PYYDETTY AVAIMEN JAKAMISTA VARTEN Tukossa
PYYDETTY JAKOA VARTEN Tukossa Tukossa
PYYDETTY AVAINPÄIVITYSTÄ EI Tukossa Tukossa Tukossa
PYYDETTY PÄIVITYSTÄ VARTEN Tukossa Tukossa Tukossa Tukossa

Sivutason lukot

Sivutason lukot vaikuttavat tietosivuun, joka koostuu yleensä useista riveistä. Vaikka PostgreSQL-prosesseissa käytetään sivutason lukituksia, sovelluskehittäjät eivät yleensä edellytä tämäntyyppistä lukitusta.

Lukitusten käyttö manuaalisesti ja nykyisten lukitusten tarkastelu

Jos haluat käyttää taulukkotason lukitusta manuaalisesti, voit käyttää LOCK-komentoa vaaditussa lukitustilassa. LOCK-komennon on oltava tapahtumassa ja lukot julkaistaan, kun tapahtuma on valmis. Esimerkiksi:

BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;

Voit tarkastella tietokannassa tällä hetkellä olevia lukituksia käyttämällä pg_locks. Jos haluat esimerkiksi tarkastella kaikkia nykyisiä lukituksia, käytä seuraavaa komentoa:

SELECT * FROM pg_locks;