COMPUTERWORLD
pod kapotou
Dvoufßzov² uzamykacφ protokol

Dnes ukß₧eme, ₧e je mo₧nΘ konstruovat transakce podle jist²ch pravidel tak, ₧e za urΦit²ch p°edpoklad∙ bude ka₧d² jejich rozvrh uspo°ßdateln². Soustav∞ takov²ch pravidel se obecn∞ °φkß protokol. P°ipome≥me, ₧e uspo°ßdatelnost znamenß ekvivalenci n∞jakΘmu sΘriovΘmu zpracovßnφ mno₧iny transakcφ.

Nejznßm∞jÜφ protokoly jsou zalo₧eny na dynamickΘm zamykßnφ a odmykßnφ objekt∙ v databßzi. Zamykßnφ (operace LOCK) je akce, kterou vyvolß transakce na objektu, aby ho ochrßnila p°ed p°φstupem od ostatnφch transakcφ. Vedle dynamickΘho p°φstupu existuje samoz°ejm∞ i statickΘ zamykßnφ a odmykßnφ objekt∙, co₧ znamenß, ₧e objekty pou₧φvanΘ v transakci jsou vÜechny uzamknuty na poΦßtku provßd∞nφ transakce a odemknuty t∞sn∞ p°ed ukonΦenφm transakce. V tomto p°φstupu mohou b²t z°ejm∞ paraleln∞ provßd∞ny pouze takovΘ transakce, kterΘ nejsou konfliktnφ, tj. nesdφlφ ₧ßdnΘ objekty. Odemknutφ (operace UNLOCK) je akce uvol≥ujφcφ objekt pro zpracovßnφ dalÜφmi transakcemi. Transakce, kterß uzamkla objekt, mß prßvo na n∞m provßd∞t operace READ a WRITE (a dalÜφ operace).

Budeme uva₧ovat jednoduch² model, kdy objekt m∙₧e b²t v danΘm Φase uzamΦen nejv²Üe jednou transakcφ. Objekt bude nutnΘ mφt v transakci uzamknut², kdykoliv k n∞mu chce tato transakce p°istupovat. Transakce se nebudou pokouÜet uzamknout objekt ji₧ uzamknut² jinou transakcφ (jinak musφ Φekat, a₧ je objekt odemknut a to toutΘ₧ transakcφ, kterß ho zamkla). Rozvrhy spl≥ujφcφ druhou podmφnku budeme naz²vat legßlnφ. Nelegßlnφ rozvrh je takov², kter² nenφ legßlnφ.

SamotnΘ uzamykßnφ a odmykßnφ libovoln²m zp∙sobem jeÜt∞ nevedou k uspo°ßdatelnΘmu rozvrhu. V p°φpadech n∞kter²ch nelegßlnφch rozvrh∙ m∙₧e dokonce nastat uvßznutφ (deadlock). V jednΘ transakci chceme uzamknout to, co je ji₧ uzamknutΘ druhou transakcφ a naopak. P°ipomφnß to situaci na k°i₧ovatce bez znaΦek p°ednosti v jφzd∞, kdy vÜichni stojφ, Φekajφ na uplatn∞nφ p°ednosti zprava a nikdo nem∙₧e vyjet jako prvnφ.

Rozvrh S1 (torzo) v tabulce 1 pro prvnφch n∞kolik operacφ transakcφ T1 a T2 ukazuje uvßznutφ.

S1

T1

T2

Stav

LOCK(B)

 

READ(B)

 

akce5(B)

 

WRITE(B)

 

LOCK(A)

 

READ(A)

 

LOCK(B)

transakce T2 chce uzamykat objekt B, kter²

READ(B)

je zamΦen transakcφ T1

UNLOCK(B)

 

A:=A+B

 

WRITE(A)

 

LOCK(A)

 

transakce T1 chce zamykat objekt A, kter² je

UNLOCK(B)

 

zamΦen transakcφ T2

READ(A)

 

Tab. 1 P°φklad uvßznutφ

Z°ejm∞ v okam₧iku, kdy v T2 je uzamykßn objekt B, nelze rozvrhnout T1 tak, aby mohlo nastat LOCK(B). Prvnφch 6 krok∙ rozvrhu S1 ji₧ tedy p°edurΦuje uvßznutφ.

Na rozdφl od situace na k°i₧ovatce, kdy se jeden z °idiΦ∙ dohod∞ s druh²m a dß mu p°ednost, se uvßznutφ v transakΦnφm zpracovßnφ obvykle °eÜφ tak, ₧e se provede ROLLBACK jednΘ transakce. Pak to, co bylo uzamknuto touto transakcφ, bude odemknuto a lze pokraΦovat ve zpracovßnφ druhΘ transakce. Nßm∞t na "nad∞jn∞jÜφ" rozvrh naznaΦuje nßsledujφcφ ·vaha: kdyby v T1 byly p°edposlednφ dv∞ operace vym∞n∞ny, staΦilo by "pozdr₧et" T2, v T1 odemknout B a pokraΦovat v provßd∞nφ T2.

╪eÜenφ s likvidacφ jednΘ transakce ovÜem nenφ nejvhodn∞jÜφ nap°. tehdy, kdy₧ druhß transakce je dlouhß. Byly proto vyvinuty jinΘ metody pro °eÜenφ uvßznutφ nebo dokonce pro prevenci uvßznutφ.

Omezφme se dßle na tzv. dob°e formovanΘ transakce, kterΘ podporujφ p°irozenΘ po₧adavky na transakce:

  1. Transakce zamykß objekt, chce-li k n∞mu p°istupovat,
  2. transakce nezamykß objekt, kdy₧ je ji₧ touto transakcφ uzamΦen²,
  3. transakce neodmykß objekt, kter² nenφ touto transakcφ uzamΦen²,
  4. po ukonΦenφ transakce vÜechny objekty, kterΘ byly touto transakcφ uzamΦeny, jsou odemknuty.

Mßme-li mno₧inu dob°e formovan²ch transakcφ, stßle jeÜt∞ neznßme postaΦujφcφ podmφnku pro to, aby vÜechny legßlnφ rozvrhy byly uspo°ßdatelnΘ. Konzistence databßze toti₧ nenφ zaruΦena tφm, ₧e objekt odemkneme bezprost°edn∞ po manipulaci s nφm.

Mezi dnes ji₧ klasickΘ v²sledky databßzovΘ teorie pat°φ tvrzenφ, ₧e k zajiÜt∞nφ uspo°ßdatelnosti vÜech legßlnφch rozvrh∙ staΦφ, aby vÜechny transakce v mno₧in∞ uva₧ovan²ch transakcφ byly dvoufßzovΘ, neboli, aby ka₧dß transakce spl≥ovala tzv. dvoufßzov² (uzamykacφ) protokol. Uzamykacφ protokol je obecn∞ mno₧ina pravidel, kterΘ udßvajφ, kdy transakce bude uzamykat a odmykat objekty databßze.

Dvoufßzovß transakce v prvnφ fßzi uzamykß vÜe, co je pot°eba, a od prvnφho odemknutφ (druhß fßze) se transakcφ zamknutΘ objekty pouze odmykajφ, tj. nenφ ji₧ pou₧ito ₧ßdnΘ operace LOCK. Tedy transakce musφ mφt vÜechny objekty uzamΦenΘ p°ed tφm, ne₧ n∞jak² objekt odemkne.

Platφ dokonce, ₧e v p°φpad∞, kdy nenφ nic znßmo o sΘmantice transakcφ, je dvoufßzovost transakcφ dokonce nutnou podmφnkou pro zachovßnφ konzistence databßze. To ovÜem nevyluΦuje p°φpad, ₧e n∞kdy lze nalΘzt legßlnφ rozvrh nedvoufßzov²ch transakcφ, kter² je uspo°ßdateln².

Tabulka 2 ukazuje mo₧n² uspo°ßdateln² rozvrh dvoufßzov²ch transakcφ T3 a T4.

T3

T4

LOCK(A)

 

READ(A)

 

LOCK(B)

READ(B)

LOCK(C)

 

READ(C)

 

WRITE(A)

 

UNLOCK(A)

 

LOCK(A)

READ(A)

WRITE(B)

WRITE(C)

 

UNLOCK(C)

 

LOCK(C)

READ(C)

WRITE(C)

UNLOCK(A)

UNLOCK(B)

UNLOCK(C)

Tab. 2 P°φklad rozvrhu dvoufßzov²ch transakcφ

V danΘm rozvrhu T4 jednou Tab. 1 P°φklad uvßznutφ Φekß na uvoln∞nφ zßmku pro A, jednou na uvoln∞nφ zßmku pro B. V opaΦnΘm p°φpad∞, tj. kdyby operace LOCK(A), resp. LOCK(B) byly v rozvrhu umφst∞ny p°ed UNLOCK(A), resp. UNLOCK(C) transakce T3, rozvrh by se stal nelegßlnφm.

Na obrßzku 1 je ukßzßno, jak m∙₧e vypadat odpovφdajφcφ volßnφ operacφ v Φase vΦetn∞ Φekßnφ na uvoln∞nφ zßmk∙.

po₧aduje a dostane po₧aduje a dostane

zßmek na A zßmek na C


T3 ¯ ¯

uvol≥uje­ uvol≥uje­

zßmek na A zßmek na C

dostane po₧aduje a dostane

zßmek na A zßmek na C


T4 ¯ ¯

­ ­ ­

po₧aduje a dostane po₧aduje zßmek na A uvol≥uje

zßmek na B je blokovßna (Φekß) zßmek na A,B,C

Obr. 1 Soub∞₧nΘ volßnφ transakcφ T3 a T4

Protokol, ve kterΘm je ka₧dß transakce dvoufßzovß, se naz²vß dvoufßzov² uzamykacφ protokol. Dvoufßzov² protokol tedy tvo°φ pouze jednu z mo₧n²ch postaΦujφcφch podmφnek pro uspo°ßdatelnost ka₧dΘho legßlnφho rozvrhu. Existujφ i jinΘ, nedvoufßzovΘ protokoly zaruΦujφcφ tuto vlastnost a korektnost dalÜφch (v naÜem modelu) neuspo°ßdateln²ch rozvrh∙. Na prost°edφ transakcφ vÜak musφ b²t kladeny dalÜφ (sΘmantickΘ) po₧adavky. Jejich znalost je pak vyu₧ita v protokolech.

Pozor ale, snadno lze nalΘzt p°φklad, kter² dokazuje, ₧e dvoufßzovost nemusφ zajiÜ¥ovat nep°φtomnost uvßznutφ, kterß jsou pro dvoufßzovΘ uzamykßnφ dost typickß. U dvoufßzov²ch uzamykacφch protokol∙ jim lze zamezit nap°. p°i°azenφm priorit transakcφm a Φekßnφm na transakce s vyÜÜφ prioritou.

DalÜφm problΘmem je tΘ₧ kaskßdovΘ ruÜenφ transakcφ. Provede-li se ROLLBACK transakce T, m∙₧e to znamenat ROLLBACK pro dalÜφ transakce, kterΘ vyu₧φvaly hodnoty aktualizovanΘ transakcφ T. Tento nedostatek se dß odstranit pomocφ striktnφch dvoufßzov²ch protokol∙, kterΘ uvol≥ujφ zßmky a₧ po ukonΦenφ transakce (COMMIT). Nev²hodou t∞chto protokol∙ je ovÜem omezenφ paralelismu. Na druhΘ stran∞ je toto °eÜenφ v souΦasn²ch S╪BD nejobvyklejÜφ.

Nev²hodou dvoufßzovΘho uzamykacφho protokolu je, ₧e v₧dy nejv²Üe jedna transakce v Φase uzamykala n∞jak² objekt. Krom∞ uveden²ch zßmk∙ existuje °ada dalÜφch metod zamykßnφ, jako nap°. sdφlenΘ a v²luΦnΘ zßmky. Uzamykßnφ m∙₧e b²t provedeno precizn∞ji, proto₧e se uva₧ujφ rozdφly mezi operacemi READ a WRITE. V²luΦn² zßmek m∙₧e b²t aplikovßn na objekty jak pro operace READ a WRITE, sdφlen² zßmek uzamykß objekty kterΘ chceme pouze Φφst. Vφce typ∙ zßmk∙ vede k uzamykacφho protokolu s podobn²mi vlastnostmi jako p∙vodnφ verze, ovÜem s v∞tÜφm stupn∞m paralelismu.



<seznam dφl∙ serißlu>   <COMPUTERWORLD>