12.08.2013 Views

konspekt - Tartu Ülikool

konspekt - Tartu Ülikool

konspekt - Tartu Ülikool

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!