Bazy danych wykład dziewiaty Transakcje Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa 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 dziewiaty Transakcje 2 / 42
Problemy współbieżności Jeśli BD komunikuje się tylko z jednym użytkownikiem, nie powstaje problem konfliktowych operacji. W praktyce BD musza często zapewniać równoległość dostępu. Przykłady: rezerwacje biletów, operacje bankowe, sklepy internetowe,... dziewiaty Transakcje 3 / 42
Problemy współbieżności Rozważmy dwie transakcje: T 1 : read(x), write(x,1), read(y), write(y,2); T 2 : read(x), write(x,4), read(y), write(y,3); Jaka wartość beda miały X i Y po zakończeniu działania T 1 i T 2? dziewiaty Transakcje 4 / 42
Problemy współbieżności Rozważmy ciag operacji transakcji T 1 i T 2 : 1 Wczytaj wolne miejsca, 2 Wczytaj wolne miejsca, 3 Rezerwuj miejsce 13, 4 Rezerwuj miejsce 13. Nie chcemy, żeby T 2 zapisała miejsce zajęte już przez T 1. Nie byłoby problemu, gdyby transakcje wykonywane były jedna po drugiej (nierealne). Transakcja T 1 powinna zablokować zajęty rekord, transakcja T 2 powinna być wycofana (ale nie warto zakładać blokady na wszystkie wolne miejsca przed wczytaniem ich przez T 1. 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 będzie 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 zwiększenia efektywności. Transakcje zatwierdzamy przez commit, anulujemy przez rollback. dziewiaty Transakcje 6 / 42
Własności transakcji ACID Atomowość (atomicity) transakcja wykona się albo w całości albo wcale, Spójność (consistency) przeprowadzi bazę danych ze stanu spójnego do spójnego, Isolacja (isolation) wynik jej działania będzie niezależny od innych działajacych w tym czasie transakcji, Trwałość (durability) wyniki jej działania sa trwałe. 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. 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 dziewiaty Transakcje 9 / 42
Odczyt brudnych danych Rozważmy scenariusz: T 1 T 2 update Miejsca set zajete = true where numer = 13; select numer from Miejsca where zajete = false; rollback; no rows selected. 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. dziewiaty Transakcje 11 / 42
Niepowtarzalny odczyt Rozważmy scenariusz: T 1 T 2 select min(a) from r; delete from r where a=8; insert into r values (5); commit; MIN(A): 8 select max(a) from r; MAX(A): 5 dziewiaty Transakcje 12 / 42
Niepowtarzalny odczyt Definicja 3 Niepowtarzalny odczyt występuje kiedy transakcja odczytuje dwa razy te same dane i otrzymuje inne wyniki, gdyż zostały one zmienione przez inna, zatwierdzona transakcję. Transakcja T 2 nie odczytała niezatwierdzonych danych, ale otrzymała niespójne odpowiedzi: max(a) < min(a). dziewiaty Transakcje 13 / 42
Fantomowe dane Rozważmy scenariusz: T 1 T 2 select a from r; insert into r values (5); commit; A: 1, 2, 8 select a from r; A: 1, 2, 8, 5 dziewiaty Transakcje 14 / 42
Fantomowe dane Definicja 4 Fantomowe dane pojawia sie, kiedy transakcja odczytujac dwa razy te same dane otrzymuje za drugim razem więcej wyników. Przy tej anomalii nie wystapiłby problem typu: max < min. dziewiaty Transakcje 15 / 42
Poziomy izolacji transakcji Wyróżniamy następujace poziomy izolacji transakcji: Z odczytem niezatwierdzonych danych (uncommited read). Z odczytem zatwierdzonych danych (commited read). Z odczytem powtarzalnym (repeatable read). Sekwencyjny (serializable). dziewiaty Transakcje 16 / 42
Poziomy izolacji transakcji Dopuszczalność anomalii przy poziomach izolacji: Poziomy izolacji brudne niepowtarzalność dane dane fantomowe uncommited read tak tak tak commited read nie tak tak repeatable read nie nie tak serializable nie nie nie 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 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 dziewiaty Transakcje 19 / 42
Szeregowalność Niech t, s, w beda zmiennymi transakcji a X, Y, Z, W rekordami w bazie danych. Transakcje T i możemy potraktować jako ciag instrukcji read(i,x,s), write(i, X,s). Ciag instrukcji r 1,..., r n jest szeregowy jeśli wszystkie instrukcje każdej transakcji występuja w jednym podciagu. Ciag instrukcji r 1,..., r n jest szeregowalny jeśli jeśli istnieje szeregowy ciag instrukcji r 1,..., r n, którego wykonanie dla wszystkich stanów bazy danych daje ten sam efekt. 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. 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); 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. 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 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. dziewiaty Transakcje 25 / 42
Blokady dzielone Blokada dzielona na rekord X pozwala innym transakcjom odczytywać wartość rekordu X. Blokady dzielone stosuje się 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 blokadę dzielona. dziewiaty Transakcje 26 / 42
Blokady na wyłaczność Jeśli transakcja chce zmienić lub usunać rekord X musi nałożyć na niego blokadę na wyłaczność. Blokady na wyłaczność nie można założyć na rekord, który ma blokadę dzielona. Jeden rekord może mieć założona tylko jedna blokadę na wyłaczność. Blokadę 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. 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 blokadę. Dlatego trzeba unikać zakładania blokad (zwłaszcza na wyłaczność) w sytuacji interakcji z użytkownikiem. 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 dziewiaty Transakcje 29 / 42
Zakleszczenia Rozważmy ciag interakcji: T 1 T 2 write(x,1) write(y, 2) write(y,1) write(x,2) Obie transakcje czekaja na zwolnienie blokady na wyłaczność. dziewiaty Transakcje 30 / 42
Zakleszczenia Oracle W przypadku wykrycia zakleszczenia SZBD Oracle wysyła do jednej z transakcji komunikat o błędzie: 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. 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 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ęsto nie warto zakładać blokady. Można zastosować np. system wypożyczania i zwracania. dziewiaty Transakcje 33 / 42
Inne rodzaje blokad Blokady inkrementacyjne. Blokady z aktualizacja. 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 dziewiaty Transakcje 35 / 42
O. traktuje każda instrukcję SQL jako atomowa (statement level atomicity). Nie można aktualizować tylko częś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. dziewiaty Transakcje 36 / 42
Każda sesja z baza danych to jedna transakcja, zakończyć taka transakcję 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 transakcję. dziewiaty Transakcje 37 / 42
Polecenia specyficzne dla Oracle SET TRANSACTION i SET TRANSACTION NAME <nazwa>, COMMIT, ROLLBACK, SAVEPOINT <nazwa>, ROLLBACK TO SAVEPOINT. dziewiaty Transakcje 38 / 42
Rollback to savepoint Polecenie rollback to savepoint <nazwa> wycofuje zmiany wykonane przez transakcję 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 będa mogły założyć tyko transakcje, które zażadaj a go po jego zwolnieniu. dziewiaty Transakcje 39 / 42
Rollback to savepoint przykład Rozważmy następujaca interakcję trzech transakcji na tabeli r(a,b): T 1 T 2 T 3......... 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; T 2 czeka... T 2 czeka... update r set a= 3 where b=5;... 1 row updated. commit;...... commit 1 row updated. 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). dziewiaty Transakcje 41 / 42
Poziomy izolacji w Oracle set isolation level [committed read serializable]; set transaction [read only read write]; dziewiaty Transakcje 42 / 42