«« ( Date ) »» // «« ( Thread ) »» // nastava - 2003

Baze

by Damjan S. Vujnovic
nedelja, 16. februar 2003 - 15:13.

Ana:
2. vazi serijski redosled: T1->T2 ako izmedju T1 i T2 postoji zavisnost po
podatku A, i T1 se jos nije zavrsila kada dodje T2: Commit, da li se PT2
azurira na TT2, a zatim se restaruju i T1 i T2, ili se PT2 ne menja (zato
sto se T1) jos nije zavrsila, a posle kvara, se restartuju opet T1 i T2?

Damjan:
NE ažurira se! Ako dođe do kvara, neće biti moguće restartovati transakciju
T2 (jer je PT2 prepisano).

Jovan:
Damjanov odgovor je diskutabilan . U principu ti mozes da prepises
TT2 u PT2 zato sto ti PT2 i ne treba pri restartovanju . Naime , kada
restartujes T1 i T2 PT za blok podatka A ce biti nepromenjen ,samim tim
jednak PT1 dok ce nova PT2 pri startovanju T2 pokazivati ili na PT1 ili na
TT1 zavisno od toga kako se restartuju ( u PT2 ce biti prepisan novi
sadrzaj )

Damjan:

Ok, u ovom konkretnom slučaju si u pravu, ali smisao algoritma (ili bolje
rečeno protokola) je da on "pokriva" sve slučajeve koji mogu nastati. Neka
se transakcije T1 i T2 izvršavaju redosledom kao na slici, i neka se podaci
A, B i C nalaze u različitim blokovima na disku:

|---|--------|--------|
| t | T1 | T2 |
|---|--------|--------|
|t1 | |Read(B) |
|t2 | |B:=B+1 |
|t3 | |Write(B)|
|t4 |Read(A) | |
|t5 |A:=A-1 | |
|t6 |Write(A)| |
|t7 | |Read(A) |
|t8 | |A:=A*2 |
|t9 | |Write(A)|
|t10| |Commit |
|t11|Read(C) | |
|t12|C:=C+1 | |
|t13|Write(C)| |
|t14|Commit | |
|---|--------|--------|

Nakon Commit(T2) je u PT2 prepisano TT2. Kvar se desio neposredno posle
trenutka t13. Kako će DBMS vratiti bazu u konzistentno stanje? Moraćeš malo
da modifikuješ algoritam, jer očigledno ne sme da prepiše baš sve ulaze u
PT2 sa ulazima iz TT2. Mada, ne vidim šta je dobitak sa takvim algoritmom...

Pozdrav,
Damjan S. Vujnović