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

Baze - TS algoritam

by Milan Stanojevic
sreda, 26. februar 2003 - 23:39.

Ovo pise kod mene u knjizi "Database systems: Complete Book".
TS(T) je za transakcije, TS(X) je za podatak X. C(X) je commit flag za
podatak X. To znaci (cini mi se) da je transakcija koja je poslednja pisala
C(X) zavrsila, tj. uradila je commit.

Skedzuler ima 3 opcije za svaki zahtev:
- dozvoljava zahtev
- vrsi rollback transakcije i dodeljuje joj novi TS
- odlaze izvrsavanje zahteva i kasnije donosi odluku da li da dozvoli zahtev
ili da uradi rollback


1. Read(X):
a) ako je TS(T) > WT(X), citanje je moguce realizovati
1) Ako je C(X)=True dozvoli citanje. Ako je TS(T) > RT(X) postavi
RT(X)=TS(T)
2) Ako je C(X)=False, odlozi T sve dok C(X) ne bude True ili dok
transakcija koja je upisala X ne bude restartovana, ondosno rollbackovana.
b) ako je TS(T) < WT(X), citanje nije moguce realizovati. Uradi
Rollback(T), tj. prekini T i restartuj T sa novim, vecim TS.

2. Write(X)
a) ako je TS(T) >= RT(X) i TS(T) >= WT(X), pisanje se moze izvrsiti i
mora se izvrsiti sledece.
1) Upisi novu vrednost za X
2) WT(X)=TS(X)
3) C(X) = false
b) ako je TS(T) >= RT(X) ali je TS(T) < WT(X), pisanje je moguce, ali
vec postoji kasnija vrednost za X. Ako je C(X)=True, onda je transakcija
koja je prethodno upisala X uradila commit, i jednostavno se ovo pisanje T
ignorise i T produzava dalje. Ako je C(X)=False, T se zaustavlja i ceka kao
u tacki 1.a)2)
c) ako je TS(T) < RT(X) pisanje nije moguce. Uraditi Rollback T

3. Commit(T)
Moraju se naci svi elementi X koje je T upisivala i postaviti C(X) na
True. Ako ima transakcija koje cekaju da T uradi commit, te transakcije
produzavaju dalje.

4. Rollback(T)
Sve transakcije koje su cekale na elementu X koji je T upisala, moraju
da ponove zahtev za citanje ili pisanje i vide da li je sada ta akcija
legalna.


Ovde postoji problem sa sledecom situacijom:
T1:Start, T2:Start, T2:Write(X), T1:Write(X), T1:Commit, T2:Abort

T1:Write(X) se nece zapravo dogoditi, a vrednost upisana od T2 nije validna
jer je T2 rollbackovana. U tom slucaju, u knjizi stoji, da skedzuler pamti
prethodnu vrednost za X i prethodni WT(X) i kada se uradi abort, vrati stare
vrednosti i postavi C(X) na false.

Molim vas da mi ukazete na razlike u odnosu na algoritam iz skripte, posto
ga nemam.

Milan