konspekt - Tartu Ülikool
konspekt - Tartu Ülikool
konspekt - Tartu Ülikool
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
12.1 Lukustamine<br />
Nagu tabelist 12.2 näeme, paar ÐÙÑÒ ÐÙÑÒ ei ole konfliktsed, seega<br />
on lihtne välistav lukk lugemise ja kirjutamisoperatsioonile liigselt paralleelsust<br />
piirav. Paljude lugejate ning väheste kirjutajate korral osutuvad kasulikuks<br />
mitu lugejat üks kirjutaja tüüpi lukud. Enne lugemist üritatakse seada lugemislukku<br />
ja enne kirjutamist kirjutamislukku. Kui lukku seada ei õnnestu, oodatakse.<br />
Kui andmetel on juba lugemislukk, siis sellele järgnev lugemine õnnestub alati,<br />
sellistele lukkudele viidatakse ka kui jagatud lukkudele. Konfliktide tekkimisest:<br />
1. Kui Ì on sooritanud lugemisoperatsiooni, siis Í ei või enne kirjutada, kui<br />
Ì on oma töö lõpetanud.<br />
2. Kui Ì on sooritanud kirjutamisoperatsiooni, siis Í ei või enne lugeda ega<br />
kirjutada, kui Ì on oma töö lõpetanud.<br />
Esimese nõude täitmiseks venitatakse lugemislukku, kui mõni teine transaktsioon<br />
soovib kasutada kirjutamislukku. Teise nõude täitmiseks venitatakse kirjutamislukku.<br />
Jagatud lukkude ühilduvust saame jälgida tabelist 12.3.<br />
soovitavad lukud<br />
seatud lukk R W<br />
— OK OK<br />
R OK oota<br />
W oota oota<br />
Tabel 12.3: jagatud lukkude ühilduvus<br />
Range kahefaasilise lukustamise kasutamine<br />
1. Andmete kasutamine<br />
a) kui lukus pole, lukusta ja jätka<br />
b) kui on konfliktne lukk, oota lahtilukustamist<br />
c) kui on mittekonfliktne lukk, jaga lukku ja jätka<br />
d) kui lukk on enda poolt seatud, “eduta” lukku ja jätka, muidu b).<br />
2. Transaktsiooni lõpus lukud lahti<br />
121<br />
Mittetäielik lugemine Lugemine peab olema tehtud enne või pärast kirjutamist.<br />
Kui lugemine toimus enne, siis seatud lugemislukk peatab kirjutamise.<br />
Uuenduste kaotsiminek Kaks transaktsiooni loevad andmeid, teevad midagi ja<br />
kirjutavad. Probleemi lahendamiseks piisab, kui sundida teine transaktsioon ootama<br />
esimese töö lõppu. Seega andmetele seatud lugemislukk tuleb kohe edutada<br />
kirjutamislukuks ning sedasi välistada teiste transaktsioonide poolt andmete lugemine.<br />
Juba seatud jagatud lukku ei saa kirjutamislukuks edutada, sel juhul tuleb kohe<br />
küsida kirjutamislukku ja vajadusel oodata lugemiste lõppu.<br />
Paneme tähele, et jagatud luku edutamine võib muuta lukku ainult rangemaks.<br />
Lukkude realiseerimine<br />
Lukkude haldamiseks on serveris spetsiaalne moodul – lukuhaldaja. Lukuhaldaja<br />
haldab lukkude tabelit, mis sisaldab:<br />
¯ andmebloki ID;<br />
¯ luku tüüp;<br />
¯ tingimusmuutuja.<br />
ID võib näiteks olla pangakonto nimi või muu väärtus, mis antakse lugemisja<br />
kirjutamisoperatsioonide argumendiks. Lukuhaldaja põhilised funktsioonid on<br />
järgnevad:<br />
¯ lock(Trans, dataItem, type);<br />
¯ unlock(Trans).<br />
Lukuhaldaja on oma olemuselt paralleelne teenus, kui lukku seada ei saa, oodatakse<br />
tingimusliku muutuja järel.<br />
12.1.1 Tupiksituatsioonid<br />
Lukkude kasutamine võib viia tupiksituatsioonide tekkimisele nagu näeme tabelis<br />
12.4 toodud näites, kus transaktsioonid Ì ja Í jäävad viimase sammuga ootama<br />
kontole seatud luku vabastamist.<br />
Tabelis 12.4 toodud näites saaks tupiksituatsiooni vältida, kui transaktsioon<br />
edutaks lugemisluku kohe kirjutamislukuks.<br />
Tupikute tekkimise võimalus on eriti suur kaua kestvate transaktsioonide korral,<br />
näiteks interaktiivsetes programmides.<br />
122