Wielowersyjne metody synchronizacji transakcji
Jednowersyjne algorytmy synchronizacji Wszystkie modyfikacje danych polegają na zniszczeniu starej wartości danych i wpisaniu w jej miejsce nowej wartości. Niski stopień współbieżności algorytmów synchronizacji transakcji problem transakcji intensywnie odczytujących dane. Przykładowa historia nieuszeregowalna: H: r 1 [x] r 2 [x, y] w 2 [x, y] c 2 r 1 [y] c 1 Wysoki stopień konfliktowości operacji operacja operacja read(x) write(x) read(x) write(x)
Wielowersyjne bazy danych W wielowersyjnych bazach danych operacja modyfikacji polega na utworzeniu nowej wersji danej i zachowaniu wersji poprzedniej. Poszczególne dane zawierają wartość aktualną danej i listę historycznych wartości danej: x = (x 0, x 1, x 2,..., x k ). Metody synchronizacji transakcji stosowane w wielowersyjnych bazach danych wykorzystujące do synchronizacji historyczne wersje danych charakteryzują się większym stopniem współbieżności transakcji. Przykład: H: r 1 [x 0 ] r 2 [x 0,y 0 ] w 2 [x 1,y 1 ] c 2 r 1 [y 0 ] c 1 Powyższa historia niepoprawna dla jednowersyjnej bazy danych jest w realizacji wielowersyjnej równoważna sekwencji transakcji T 1 T 2. Konfliktowość operacji: T l T k read(x i ) write(x i ) read(x i ) write(x i ) N/A read(x j ) write(x j )
Historie wielowersyjne Historią wielowersyjną hw zbioru transakcji τ nazywamy częściowo uporządkowany zbiór operacji tych transakcji: hw(τ)=( T hw(τ),p wr,h) gdzie: jest sumą wszystkich operacji transakcji ze zbioru τ; 1. T ( τ ) = hw U T Ti τ i 2. p U p hw T i i τ ; jest relacją częściowego porządku na zbiorze operacji, pokrywającą się z porządkiem operacji w transak- 3. h : T hw T hw jest takim odwzorowaniem operacji odczytu {r i (x) T hw(τ)} w zbiór operacji zapisu {w j (x) T hw(τ)}, że dla każdej operacji odczytu r i (x), jeżeli h(r i (x)) = w j (x), to w j (x) p wr r i (x) (operacje tworzenia wersji muszą poprzedzać operacje ich odczytu). Odwzorowanie h określa wersje danych odczytywanych przez transakcje.
Uszeregowalność historii wielowersyjnych Wielowersyjna historia współbieżna transakcji jest uszeregowalna, jeżeli jest równoważna (stanowo i obrazowo, albo konfliktowo) choć jednej wielowersyjnej historii sekwencyjnej tych samych transakcji. Czy taka definicja jest wystarczająca? Załóżmy, że baza danych zawiera daną x, której wartość początkowa jest równa: x=(x 0 =1000). Na bazie danych trzy transakcje, z których każda zwiększa wartość danej x o 1000: T i ={x=x+1000}, i=1,2,3. Rozważmy następującą historię tych transakcji: H serial : r 1 [x 0 ], w 1 [x 0 +1000], c 1, r 2 [x 0 ], w 2 [x 0 +1000], c 2, r 3 [x 0 ], w 3 [x 0 +1000], c 3 Końcowy stan bazy danych będzie następujący: x=(x 0 =1000,x 1 =2000,x 2 =2000,x 3 =2000) Wielowersyjna historia sekwencyjna jest niepoprawna!!! Potrzebna jest nowa definicja poprawnej wielowersyjnej historii sekwencyjnej
Standardowe sekwencyjne historie wielowersyjne Sekwencyjna historia wielowersyjna jest standardowa, jeżeli każda operacja odczytu danej dotyczy ostatnio utworzonej wersji tej danej. Bardziej formalnie, dla dowolnej operacji odczytu r i [x] nie istnieje operacja zapisu w j [x] taka, że spełniony byłby warunek: h(r i [x]) p hw w j [x] p hw r i [x] Kryterium uszeregowalności wielowersyjnej Wielowersyjna historia hw(τ) zbioru transakcji τ jest uszeregowalna wtedy i tylko wtedy, gdy jest ona równoważna dowolnej standardowej sekwencyjnej historii wielowersyjnej zbioru transakcji τ.
Wielowersyjny algorytm blokowania dwufazowego (model dwu-wersyjny) Wielowersyjny algorytm blokowania dwufazowego wprowadza nowy rodzaj operacji: certyfikację wersji danych. Odczytywane przez transakcje mogą być jedynie wersje certyfikowane. Stąd nowe wersje tworzone przez transakcje są niedostępne dla innych transakcji aż do momentu ich certyfikacji. Z operacją certyfikacji związany jest nowy rodzaj blokady. Operacje certyfikacji wykonywane są automatycznie przez system bazy danych w momencie zatwierdzania transakcji. Ze względu na proces blokowania, dane w bazie danych mogą występować w jednym z czterech stanów: dana nie zablokowana - dana zablokowana dla odczytu - R dana zablokowana dla zapisu - W dana zablokowana do certyfikacji - C Kompatybilność blokad blokada posiadana blokada żądana R W C R W C
Wielowersyjny algorytm blokowania dwufazowego i) ii) T 1 T 3 T 3 T 2 R R R X W new version X' T4 X C replace X' T4 T 4 Dana występuje w dwóch wersjach X i X. Wersja X jest zatwierdzoną wersją danej udostępnianą transakcjom innym niż twórca wersji X. Wersja X jest niezatwierdzoną wersją danej dostępną jedynie dla transakcji, która ją utworzyła. Algorytm odczytu wersji danej Read(x, tid) begin Odczyt konfliktowy B: if (LOCK(x, tid) = C) tylko z certyfikacją then begin < wstaw żądanie do kolejki i czekaj>; go to B; end; else begin LOCK(x, tid) R; < czytaj zaakceptowana wersję x >; end; end Read;
Algorytm zapisu wersji danej Write(x, tid) begin B: if (LOCK(x,tid) = 0 or LOCK(x,tid)=R) then begin LOCK(X, tid) W; < twórz nową wersję x' >; end; else begin <wstaw żądanie do kolejki i czekaj>; go to B; end; end Write; Zapis nie jest konfliktowy z odczytem Algorytm certyfikacji niezatwierdzonej wersji danej Certify(x, tid) begin B: if (liczba blokad do odczytu na X=0) then begin LOCK(X, tid) C; <zamień starą wersję x na x'>; end; else begin < wstaw żądanie do kolejki i czekaj>; go to B; end; end Certify;
Przykład H: r 1 [x] r 2 [x,y] w 2 [x,y] c 2 r 1 [y] c 1 Ta historia jest nieuszeregowalna w jednowersyjnej bazie danych ze względu na cykl w grafie x uszeregowalności: T2 T1 y Algorytm poprawnie uporządkuje powyższą historię: H hw : r 1 [x 0 ] r 2 [x 0,y 0 ] w 2 [x 1,y 1 ] c 2 r 1 [y 0 ] c 1 c 2 T1 x T2 y
Wielowersyjny algorytm znaczników czasowych W wielowersyjnej bazie danych dla każdej danej x=<x 0,x 1,...,x n > utrzymywana jest jej historia: H(x)={(Read_TS(x 0 ),Write_TS(x 0 ),...,(Read_TS (x n ), Write_TS(x n )}, gdzie: Read_TS(x i ) - największy (najpóźniejszy) znacznik czasowy ze zbioru wszystkich transakcji, które pomyślnie odczytały i-tą wersję danej x. Write_TS(x i )- znacznik czasowy transakcji, która utworzyła i-tą wersję danej x. Historia H(x)={(1,5),(8,10),(13,18),(19,19)} oznacza, że dana x ma cztery wersje (x 0,x 1,x 2,x 3 ), utworzonych przez transakcje o znacznikach czasowych 1,8,13,19, i odczytanych ostatnio przez transakcje o znacznikach czasowych 5,10,18,19. r(x) w(x) r(y) w(z) Moduł synchronizacji r(x 2 ) w(x 3 ) r(y 9 ) w(z 7 )
Algorytmy synchronizacji Algorytm odczytu zamienia odwołanie do generycznej danej na odczyt jednej z wersji tej danej. Odczytywana jest najstarsza wersja ze zbioru wersji utworzonych przez transakcje młodsze od danej. Operacje odczytu są zawsze poprawne nie mogą być przyczyną wycofania transakcji. Read(Ti,x) begin < czytaj xk,takie że Write_TS(xk)= max{write_ts(xj):write_ts(xj) TS(Ti)}>; if (Read_TS(xk) < TS(Ti)) then Read_TS(xk) TS(Ti); end Read; Operacja zapisu tworzy nową wersję danej. Operacja ta będzie powodem odrzucenia transakcji gdy w zbiorze wersji danej istnieje wersja x i taka, że znacznik czasowy transakcji spełnia zależność: Write_TS(xi) TS(T k )< Read_TS(xi) Write(Ti, x) begin if (istnieje xk, takie że Write_TS(xk) TS(Ti)< Read_TS(xk)) then < wycofaj Ti i powtórnie uruchom ją z nowym znacznikiem czasowym >; else begin < utwórz xk >; Write_TS(xk), Read_TS(xk) TS(Ti); end; end Write;
Przykład x 1 x 2 x 3 x 4 7:00 7:15 7:45 7:50 7:55 8:40 9:10 9:30 T 7:20 :w(x) T 8:50 :r(x) x 1 x 5 x 2 x 3 x 4 7:00 7:15 7:45 7:50 7:55 8:40 9:10 9:30 T 8:15 :w(x) x 1 x 2 x 3 x 4 7:00 7:15 7:45 7:50 7:55 8:40 9:10 9:30
Synchronizacja transakcji w systemie ORACLE Poziom izolacji Read Committed Dirty write Dirty read Lost update Fuzzy read Read skew Write skew Phantom - - Serializable - - - - - Serializable +for update - - - - - - Dla synchronizacji zapisów (brudny zapis) blokowanie dwufazowe operacji zapisu. Dla zwiększenia efektywności blokowania hierarchia ziarnistości blokowania i blokady intencyjne. Dla synchronizacji odczytów i zapisów wielowersyjna metoda znaczników czasowych dla pojedynczych zapytań (read consistency) i dla całych transakcji (transaction consistency). Dla eliminacji anomalii lost update metoda first committer wins. Dla zapewnienia pełnej uszeregowalności blokady wyłączne poprzedzające operację odczytu (klauzula FOR UPDATE).
Anomalie w trybie serializable Anomalia typu skrośny zapis (write skew) Transakcja T1 czyta daną x, a transakcja T2 odczytuje daną y. Następnie T1 modyfikuje wartość danej y, a transakcja T2 modyfikuje daną x. (x>y) r1[x=200], r2[y=100], w1[y=180], w2[x=150],... 1. Historia sekwencyjna T1 T2: x=200, y=180; x > y 2. Historia sekwencyjna T2 T1: x=150, y=100; x > y 3. Historia współbieżna T1 T2: x=150, y=180; x < y!!! Transakcja T1 select * from zespoły where id_zesp=1; if exists then insert into pracownicy values(100, Nowak,..., 1); Transakcja T2 select count(*) into :liczba from pracownicy where id_zesp=1; if liczba = 0 then delete from zespoły where id_zesp = 1;
Typy blokad w DB2 IN intencyjny brak operacji NS następny klucz - współdzielona U - modyfikacja NX - następny klucz - wyłączna Z silna wyłączna NW - następny klucz słaba wyłączna W słaba wyłączna założona /żądana IN IS NS S IX SIX U NX X Z NW W IN tak tak tak tak tak tak tak tak tak nie tak tak IS tak tak tak tak tak tak tak tak tak nie tak tak NS tak tak tak tak tak tak tak nie nie nie nie nie S tak tak tak tak nie nie tak tak nie nie tak nie IX tak tak nie nie tak nie nie nie nie nie nie nie SIX tak tak nie nie nie nie nie nie nie nie nie nie U tak tak tak tak nie nie nie nie nie nie nie nie NX tak nie tak nie nie nie nie nie nie nie nie nie X tak nie nie nie nie nie nie nie nie nie nie nie Z nie nie nie nie nie nie nie nie nie nie nie nie NW tak nie tak nie nie nie nie nie nie nie nie tak W tak nie nie nie nie nie nie nie nie nie tak nie
Zakładanie blokad w DB2 Poziom izolacji Odczyt Intencja zapisu Zapis RR S U X RS IS/NS IX/U IX/X CS IS/NS IX/U IX/X UR IN IX/U IX/X
Projekt poprawnego modelu zarządzania współbieżnością transakcji Prawidłowa synchronizacja transakcji wymaga od programistów: Określenia wymagań aplikacji odnośnie poziomu poprawności danych i efektywności przetwarzania Ustalenia właściwego trybu izolacji transakcji Dla zastosowań wymagających pełnej poprawności danych włączenia dodatkowych mechanizmów synchronizacji lub zastosowania odpowiedniej struktury przepływu sterowania w aplikacjach