Bazy danych – wykład dziewiaty Transakcje
Transkrypt
Bazy danych – wykład dziewiaty Transakcje
Bazy danych – wykład dziewiaty ˛ Transakcje Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 1 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 2 / 42 Problemy współbieżności Jeśli BD komunikuje sie˛ tylko z jednym użytkownikiem, nie powstaje problem konfliktowych operacji. W praktyce BD musza˛ cz˛esto zapewniać równoległość dostepu. ˛ Przykłady: rezerwacje biletów, operacje bankowe, sklepy internetowe, ... Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 3 / 42 Problemy współbieżności Rozważmy dwie transakcje: T1 : read(X), write(X,1), read(Y), write(Y,2); T2 : read(X), write(X,4), read(Y), write(Y,3); Jaka˛ wartość beda˛ miały X i Y po zakończeniu działania T1 i T2 ? Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 4 / 42 Problemy współbieżności Rozważmy ciag ˛ operacji transakcji T1 i T2 : 1 Wczytaj wolne miejsca, 2 Wczytaj wolne miejsca, 3 Rezerwuj miejsce 13, 4 Rezerwuj miejsce 13. Nie chcemy, żeby T2 zapisała miejsce zajete ˛ już przez T1 . Nie byłoby problemu, gdyby transakcje wykonywane były jedna po drugiej (nierealne). Transakcja T1 powinna zablokować zajety ˛ rekord, transakcja T2 powinna być wycofana (ale nie warto zakładać blokady na wszystkie wolne miejsca przed wczytaniem ich przez T1 . Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 5 / 42 Transakcje Definicja 1 Transakcja jest to ciag ˛ operacji na bazie danych, które powinny być wykonane w sposób atomowy, jak jedna instrukcja. Jeśli nie bedzie ˛ można wykonac jednej z instrukcji w transakcji, trzeba anulować efekt wszystkich. Standard SQL domyślnie wymaga, żeby transakcje traktować jako przetważane szeregowo. W praktyce implementacje BD pozwalaja˛ na osłabienie tego wymagania w celu zwiekszenia ˛ efektywności. Transakcje zatwierdzamy przez commit, anulujemy przez rollback. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 6 / 42 Własności transakcji – ACID Atomowość (atomicity) – transakcja wykona sie˛ albo w całości albo wcale, Spójność (consistency) – przeprowadzi baz˛e danych ze stanu spójnego do spójnego, Isolacja (isolation) – wynik jej działania bedzie ˛ niezależny od innych działajacych ˛ w tym czasie transakcji, Trwałość (durability) – wyniki jej działania sa˛ trwałe. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 7 / 42 Przyczyny konfliktów Jeśli dwie transakcje chca˛ zapisać ten sam rekord, to wchodza˛ ze soba˛ w konflikt. Źródłem problemów jest też sytuacja, w której jedna transakcja zapisuje dane, które chce odczytać druga. Jeśli dwie transakcje tylko odczytuja˛ dane, to nie moga˛ wejść ze soba˛ w konflikt. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 8 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 9 / 42 Odczyt „brudnych danych” Rozważmy scenariusz: T1 update Miejsca set zajete = true where numer = 13; T2 select numer from Miejsca where zajete = false; no rows selected. rollback; Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 10 / 42 Odczyt „brudnych danych” Definicja 2 Odczyt „brudnych danych” ma miejsce kiedy jedna transakcja odczytuje dane, które zmieniła druga transakcja, która została potem wycofana. Uwaga. To sie nie ma prawa zdażyć w BD Oracle. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 11 / 42 Niepowtarzalny odczyt Rozważmy scenariusz: T1 T2 select min(a) from r; MIN(A): 8 delete from r where a=8; insert into r values (5); commit; select max(a) from r; MAX(A): 5 Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 12 / 42 Niepowtarzalny odczyt Definicja 3 Niepowtarzalny odczyt wystepuje ˛ kiedy transakcja odczytuje dwa razy te same dane i otrzymuje inne wyniki, gdyż zostały one zmienione przez inna, ˛ zatwierdzona˛ transakcje. ˛ Transakcja T2 nie odczytała niezatwierdzonych danych, ale otrzymała niespójne odpowiedzi: max(a) < min(a). Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 13 / 42 Fantomowe dane Rozważmy scenariusz: T1 T2 select a from r; A: 1, 2, 8 insert into r values (5); commit; select a from r; A: 1, 2, 8, 5 Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 14 / 42 Fantomowe dane Definicja 4 Fantomowe dane pojawia˛ sie, kiedy transakcja odczytujac ˛ dwa razy te same dane otrzymuje za drugim razem wiecej ˛ wyników. Przy tej anomalii nie wystapiłby ˛ problem typu: max < min. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 15 / 42 Poziomy izolacji transakcji Wyróżniamy nastepuj ˛ ace ˛ poziomy izolacji transakcji: Z odczytem niezatwierdzonych danych (uncommited read). Z odczytem zatwierdzonych danych (commited read). Z odczytem powtarzalnym (repeatable read). Sekwencyjny (serializable). Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 16 / 42 Poziomy izolacji transakcji Dopuszczalność anomalii przy poziomach izolacji: Poziomy izolacji niepowtarzalność uncommited read „brudne dane” tak tak dane fantomowe tak commited read nie tak tak repeatable read nie nie tak serializable nie nie nie Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 17 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 18 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 19 / 42 Szeregowalność Niech t, s, w beda˛ zmiennymi transakcji a X , Y , Z , W rekordami w bazie danych. Transakcje Ti możemy potraktować jako ciag ˛ instrukcji read(i,X,s), write(i, X,s). Ciag ˛ instrukcji r1 , . . . , rn jest szeregowy jeśli wszystkie instrukcje każdej transakcji wystepuj ˛ a˛ w jednym podciagu. ˛ Ciag ˛ instrukcji r1 , . . . , rn jest szeregowalny jeśli jeśli istnieje szeregowy ciag ˛ instrukcji r10 , . . . , rn0 , którego wykonanie dla wszystkich stanów bazy danych daje ten sam efekt. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 20 / 42 Szeregowalność Jeśli ciag ˛ instrukcji jest szeregowalny, to możemy traktować transakcje jakby były wykonywane sekwencyjnie. Osiagamy ˛ najwyższy możliwy poziom izolacji. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 21 / 42 Szeregowalność – przykład Ciag ˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s), write(2, X, s*3); read(1, Y, t); write(1,Y, t+10); read(2, Y, s); write(2, Y, s*3); nie jest szeregowy ale jest szeregowalny. Równoważny ciag ˛ to: read(1, X,t), write(1, X, t+10); read(1, Y, t); write(1,Y, t+10); read(2, X, s), write(2, X, s*3); read(2, Y, s); write(2, Y, s*3); Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 22 / 42 Szeregowalność – przykład Ciag ˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s), write(2, X, s*3); read(2, Y, s); write(2, Y, s*3); read(1, Y, t); write(1,Y, t+10); nie jest szeregowalny. Ciag ˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s), write(2, X, s + 30); read(2, Y, s); write(2, Y, s + 30); read(1, Y, t); write(1,Y, t+10); jest szeregowalny tylko z powodu przmienności dodawania. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 23 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 24 / 42 Blokady W praktyce szeregowalność jest zbyt silnym wymogiem. Szeregowanie transakcji mogłoby spowodować zbyt długi czas działania poszczególnych transakcji. Bardziej realistycznym rozwiazaniem ˛ sa˛ słabsze poziomy izolacji. W celu ich zapewnienia można stosować mechanizmy takie jak blokady wierszy lub (rzadziej) całych tabel. Uwaga. W praktyce Oracle sam zarzadza ˛ blokadami jakie nakładaja˛ działania transakcji. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 25 / 42 Blokady dzielone Blokada dzielona na rekord X pozwala innym transakcjom odczytywać wartość rekordu X. Blokady dzielone stosuje sie˛ w celu zabezpieczenia odczytanego rekordu przed zmiana˛ w czasie działania transakcji, która go odczytała. Jeden rekord może mieć założonych wiele blokad dzielonych. Transakcja odczytujac ˛ rekord X nakłada na niego blokade˛ dzielona. ˛ Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 26 / 42 Blokady na wyłaczność ˛ Jeśli transakcja chce zmienić lub usunać ˛ rekord X musi nałożyć na niego blokade˛ na wyłaczność. ˛ Blokady na wyłaczność ˛ nie można założyć na rekord, który ma blokade˛ dzielona. ˛ Jeden rekord może mieć założona˛ tylko jedna˛ blokade˛ na wyłaczność. ˛ Blokade˛ taka˛ zakładamy modyfikujac ˛ rekord. Przestaje być on widoczny (przy poziomie commited read) aż do chwili zatwierdzenie transakcji. Zatwierdzenie transakcji zwalnia wszystkie nałozone przez nia˛ blokady. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 27 / 42 Zawieszenie wykonywania transakcji Nałożona blokada może spowodować zawieszenie wykonywania transakcji do czasu zatwierdzenia transakcji, która nałożyła blokade. ˛ Dlatego trzeba unikać zakładania blokad (zwłaszcza na wyłaczność) ˛ w sytuacji interakcji z użytkownikiem. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 28 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 29 / 42 Zakleszczenia Rozważmy ciag ˛ interakcji: T1 write(X,1) T2 write(Y, 2) write(Y,1) write(X,2) Obie transakcje czekaja˛ na zwolnienie blokady na wyłaczność. ˛ Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 30 / 42 Zakleszczenia – Oracle W przypadku wykrycia zakleszczenia SZBD Oracle wysyła do jednej z transakcji komunikat o błedzie: ˛ „ORA–00060: deadlock detected while waiting for resource”. Transkacja, która otrzymała komunikat o błedzie kończy oczekiwanie i może np. wykonać commit lub rollback. Druga z transakcji oczekuje dalej na zwolnienie blokady. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 31 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 32 / 42 Długie transakcje Jeśli czas modyfikacji trwa długo (np. modyfikacje programu lub pliku tekstowego przez użytkownika) to cz˛esto nie warto zakładać blokady. Można zastosować np. system wypożyczania i zwracania. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 33 / 42 Inne rodzaje blokad Blokady inkrementacyjne. Blokady z aktualizacja. ˛ Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 34 / 42 Outline 1 Transakcje Problemy interakcji 2 Metody usuwania konfliktów Szeregowalność Blokady Zakleszczenia Misc 3 Transakcje i blokady w BD Oracle Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 35 / 42 O. traktuje każda˛ instrukcje˛ SQL jako atomowa˛ (statement level atomicity). Nie można aktualizować tylko cz˛eści tabeli. Wycofanie instrukcji SQL skutkuje także wycofaniem skutków działania wyzwalaczy, które uruchomiła. Wycofanie instrukcji SQL nie powoduje wycofania całej transakcji. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 36 / 42 Każda sesja z baza˛ danych to jedna transakcja, zakończyć taka˛ transakcje˛ można przez polecienie commit lub rollback. Innym sposobem na zakończenie transakcji (jako commit) jest wydanie polecenia DDL lub zakończenie połaczenia ˛ z baza˛ danych (disconnect). Każda nowa komenda SQL po commit lub instrukcji DDL rozpoczyna nowa˛ transakcje. ˛ Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 37 / 42 Polecenia specyficzne dla Oracle SET TRANSACTION i SET TRANSACTION NAME <nazwa>, COMMIT, ROLLBACK, SAVEPOINT <nazwa>, ROLLBACK TO SAVEPOINT. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 38 / 42 Rollback to savepoint Polecenie rollback to savepoint <nazwa> wycofuje zmiany wykonane przez transakcje˛ po założeniu punktu <nazwa>. Wszystkie blokady założone po tym punkcie zostaja˛ zwolnione. Jeśli inna transakcja czekała na zwolnienie blokady już wcześniej, to nie otrzyma zasobu. Nowe blokady bed ˛ a˛ mogły założyć tyko transakcje, które zażadaj ˛ a˛ go po jego zwolnieniu. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 39 / 42 Rollback to savepoint – przykład Rozważmy nastepuj ˛ aca ˛ interakcje˛ trzech transakcji na tabeli r(a,b): T1 T2 T3 ... ... ... savepoint powrot; update r set a= 1 where b=5; 1 row updated. update r set a= 2 where b=5; rollback to s. powrot; T2 czeka ... T2 czeka ... update r set a= 3 where b=5; ... 1 row updated. commit; ... ... commit 1 row updated. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 40 / 42 Poziomy izolacji w Oracle Domyślnym poziomem izolacji jest read commited. Inne poziomy to serializable oraz read only. Poziom read only zapewnia powtarzalność wyników zapytań, zabrania modyfikacji bazy danych (set transaction read only). Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 41 / 42 Poziomy izolacji w Oracle set isolation level [committed read | serializable]; set transaction [read only | read write]; Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, – wykładWarszawa) dziewiaty ˛ Transakcje 42 / 42