Tutustu lukitukseen
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;