Andmebaasi soovituslik lukk

Joel Edenberg

PostgreSQLi andmebaasis on võimalik kasutada lukustamist andmekirjete ning andmetabelite peal. Kuid lisaks saab kasutada ka soovituslikke lukke (advisory locks), mis on mõeldud kasutamiseks rakenduste tasemel - pg_advisory. Soovituslikud lukud ei ole seotud andmebaasis olevate andmetega - andmetabelite ega tabelikirjetega. Selle asemel saavad andmebaasi kasutavad rakendused ise defineerida lukustamiseks kasutatavad võtmed. Kuna lukustamise võtmed ei pea üheselt vastama andmetele andmebaasis on võimalik luua loogilisi lukustusmehanisme, mis toimivad kõrgemal abstraktsiooni tasemel. Näiteks saab luua luku, mis tagab, et korraga saab uuendada ainult ühe maakonna kasutajaid. Ise defineeritud lukud võivad osutuda väga kasulikuks tööriistaks "võistlusolukordade" lahendamisel (race-condition).

Lukkude tüübid

Sessiooni lukud

Lukke hoitakse kuni sessiooni lõpuni (ühendus andmebaasiga) või kui lukk vabastatakse käsitsi.

Transaktsiooni lukud

Lukk vabastatakse automaatselt kui andmebaasi transaktsioon lõppeb. Sellised lukud on enim kasutatud, kuna lukkude vabastamine toimub automaatselt koos transaktsioonide haldusega.

Eksklusiivsed või jagatud lukud

PostgreSQL pakub lukustamiseks jagatud või eksklusiivseid lukke. Eksklusiivsed lukud tähendavad, et kõik teised päringud, kes soovivad kas eksklusiivset või jagatud lukku, jäävad ootama. Jagatud lukk tähendab, et teised jagatud lukud saavad samamoodi juurdepääsu. Kuid eksklusiivse luku päring jääb ootama, kuni kõik jagatud lukud on vabastatud.

pg_advisory_xact_lock(key) — eksklusiivne pg_advisory_xact_lock_shared(key) — jagatud

Kasutuse näide

BEGIN; SELECT pg_advisory_xact_lock(12345); -- siin saab teha lukustatud andmetega tööd COMMIT; -- lukk vabastatakse automaatselt