Controllo della concorrenza basato sui timestamp
Timestamp Il timestamp identifica una transazione è assegnato alla transazione dallo scheduler quando la transazione ha inizio può essere il valore di un contatore l’ora di inizio della transazione
Osservazione Se il timestamp della transazione T1 è minore del timestamp della transazione T2, la transazione T1 è iniziata prima della transazione T2 quindi se le transazioni non fossero eseguite in modo concorrente ma seriale, T1 verrebbe eseguita prima di T2
Serializzabilità Uno schedule è serializzabile se è equivalente allo schedule seriale in cui le transazioni compaiono ordinate in base al loro timestamp
Serializzabilità Quindi uno schedule è serializzabile se: per ciascun item acceduto da più di una transazione, l’ordine con cui le transazioni accedono all’item è quello imposto dai timestamp
T1T1 T2T2 read(X) X:=X+10X:=X+5 write(X) TS(T 1 )=110 TS(T 2 )=100 Quindi uno schedule è serializzabile se è equivalente allo schedule seriale T 2 T 1
T1T1 T2T2 read(X) X:=X+5 write(X) read(X) X:=X+10 write(X) T 1 legge il valore di X scritto da T 2
T1T1 T2T2 read(X) X:=X+5 X:=X+10 write(X) Consideriamo il seguente schedule Lo schedule non è serializzabile in quanto T 1 legge X prima che T 2 l’abbia scritto
TS(T 1 )=110 TS(T 2 )=100 Quindi uno schedule è serializzabile se è equivalente allo schedule seriale T 2 T 1
T1T1 T2T2 read(Y) X:=Y+5 write(X) read(Y) X:=Y+10 write(X) Il valore finale di X viene scritto da T 1
Consideriamo il seguente schedule Lo schedule è serializzabile solo se non viene eseguita la scrittura di X da parte di T 2
read timestamp, write timestamp A ciascun item X vengono associati due timestamp: read timestamp di X (read_TS(X)) il più grande fra tutti i timestamp di transazioni che hanno letto con successo X write timestamp di X (write_TS(X)) il più grande fra tutti i timestamp di transazioni che hanno scritto con successo X
Controllo della serializzabilità Ogni volta che una transazione T cerca di eseguire un read(X) o un write(X), occorre confrontare il timestamp TS(T) di T con il read timestamp e il write timestamp di X per assicurarsi che l’ordine basato sui timestamp non è violato
Controllo della serializzabilità Algoritmo T cerca di eseguire una write(X): 1.se read_TS(X) TS(T), T viene rolled back 2.se write_TS(X) TS(T), l’operazione di scrittura non viene effettuata 3.se nessuna delle condizioni precedenti è soddisfatta allora write(X) è eseguita write_TS(X):=TS(T)
Controllo della serializzabilità Algoritmo T cerca di eseguire una read(X): 1.se write_TS(X) TS(T), T viene rolled back 2.se write_TS(X) TS(T), allora read(X) è eseguita se read_TS(X) TS(T) allora read_TS(X):= TS(T)