 
                                Transakcje Wykład 10 Prowadzący: dr Paweł Drozda Wprowadzenie  Zmiany świata rzeczywistego muszą znaleźć odzwierciedlenie w bazie (przejście ze stanu spójnego do innego stanu spójnego)  Problemy:  Awaryjność  Współbieżny dostęp do danych  Rozproszenie baz dr Paweł Drozda Przykład wprowadzający  Rezerwacja biletów lotniczych na lot X w firmie A przez pasażera Y za kwotę Z  Awaria po dokonaniu zapłaty (przed wystawieniem biletu) – częściowo wykonane operacje  Dwie osoby w tym samym czasie rezerwują ostatni bilet na dany lot  Rozwiązanie - transakcja dr Paweł Drozda Transakcje  Sekwencja logicznie powiązanych operacji na bazie danych. Przeprowadza bazę z jednego stanu spójnego w inny stan spójny  Dozwolone operacje:  Odczyt, zapis danych  Zakończenie transakcji  Akceptację lub wycofanie transakcji  Rozwiązuje problemy awaryjności, wielodostępności i rozproszenia dr Paweł Drozda Transakcja – rezerwacja lotu begin UPDATE Loty SET wolneMiejsca=wolneMiejsca-1 WHERE idlotu =X; UPDATE Konta SET saldo = saldo –Z WHERE klient=Y; UPDATE Konta SET saldo = saldo +Z WHERE klient=A; INSERT INTO Pasażerowie(lot,klient) VALUES (X,Y); commit; // zatwierdzenie transakcji dr Paweł Drozda Własności transakcji ACID (1)  Atomowość (Atomicity) Wykonanie całej transakcji albo niewykonanie żadnej operacji składowej (odzwierciedlenie świata rzeczywistego)  Spójność (Consistency) Transakcja nie narusza spójności (w czasie wykonywania transakcji baza może być przejściowo niespójna) dr Paweł Drozda Własności transakcji ACID (2)  Izolacja (Isolation) Transakcje wykonywane jednocześnie nie wpływają na siebie  Trwałość (Durability) Po zakończeniu transakcji zaktualizowane dane nie mogą zostać w żaden sposób utracone dr Paweł Drozda Zachowanie ACID - przykład  Atomowość – gdy lot zostanie zarezerwowany z zapłatą  Spójność – taka sama kwota dodana co odjęta; liczba miejsc w tabeli loty musi być równa liczbie nowych rekordów w tabeli Pasażerowie  Izolacja – różne rezerwacje nie wpływają na siebie  Trwałość – odzwierciedlenie w bazie nowych stanów dr Paweł Drozda Możliwe przebiegi transakcji p. COMMITED Start COMMITED READ/WRITE FAILED TERMINATED Koniec transakcji – wszystkie operacje zostały wykonane. Wybór: -wprowadzić zmiany do bazy poprzez zatwierdzenie (commit) -wycofać transakcję (rollback) dr Paweł Drozda Reprezentacja transakcji  Operacje transakcji:     Zapis – w(x) Odczyt – r(x) Zatwierdzenie – c wycofanie – a  Reprezentacja za pomocą grafu G(V,A):  V – węzły odpowiadające operacjom transakcji  A – krawędzie reprezentujące porządek na zbiorze operacji dr Paweł Drozda Reprezentacja transakcji - przykład T1 a) r(x) r(y) w(x) w(y) c T2 b) r(x) r(y) w(x) r(z) r(y) w(y) dr Paweł Drozda c Kontrola wielodostępu  Konieczność zapewnienia dostępu do bazy danych wielu użytkownikom  Zapewnienie możliwości wykonania współbieżnie transakcji dr Paweł Drozda Szeregowalność transakcji (1)  Definicje:  Harmonogram (realizacja) – ciąg operacji z więcej niż jednej transakcji z zachowaniem porządku w każdej z transakcji  sekwencyjny – bez przeplatania operacji pomiędzy transakcjami  niesekwencyjny – operacje różnych transakcji przeplatają się  Szeregowalność – możliwość ustawienia transakcji współbieżnych, tak aby wynik był równoważny z wykonaniem sekwencyjnym dr Paweł Drozda Szeregowalność transakcji (2)  Zapewnienie szeregowalności – odpowiednie uporządkowanie operacji zapisu i odczytu:  transakcje czytają ten sam element – kolejność odczytu nieistotna  Transakcje czytają lub zapisują różne elementy – kolejność wykonania nieistotna  Jedna z transakcji zapisuje element a druga odczytuje lub zapisuje – kolejność istotna dr Paweł Drozda Szeregowalność - przykład T1 r(x) w(x) T2 r(y) r(x) w(y) w(x) commit r(y) w(y) commit Szeregowanie kolizji T1 T2 r(x) w(x) r(y) w(y) commit r(x) dr Paweł Drozda w(x) r(y) w(y) commit Graf szeregowalności  Graf skierowany G(N,E) jest grafem szeregowalności, gdzie:  transakcje Ti obrazowane są przez wierzchołki  Ti  Tj jest krawędzią grafu, gdy Tj zapisuje wartość elementu wcześniej czytanego przez Ti  Ti  Tj jest krawędzią grafu, gdy Tj czyta wartość elementu zapisanego przez Ti  Ti  Tj jest krawędzią grafu, gdy Tj zapisuje wartość elementu wcześniej zapisanego przez Ti  Jeśli w grafie G istnieje krawędź Ti  Tj to w sekwencyjnym harmonogramie równoważnym Ti występuje przed Tj dr Paweł Drozda Warunek szeregowalności grafu  Harmonogram jest szeregowalny wtedy i tylko wtedy, gdy graf szeregowalności dla tego harmonogramu jest acykliczny T1 r(x) x=x-30 T2 w(x) r(y) r(x) r(y) T1 x=x*1.1 w(x) y=y*1.1 y=y+30 w(y) commit w(y) T2 dr Paweł Drozda Graf cykliczny commit Odtwarzalność  Szeregowalność daje gwarancję poprawności wykonania harmonogramu transakcji, gdy wszystkie transakcje są zaakceptowane (commited)  Problem – jedna z transakcji wycofana (przez użytkownika, awaria systemu itd.) H = r1(x) w1(x), r2(x), w2(x), c2 r1(x), w1(x), <awaria>, c1 dr Paweł Drozda Odtwarzalność - definicje  Ti czyta daną x z transakcji Tj w harmonogramie H jeżeli:  wj(x)<ri(x)  aj< ri(x)  jeżeli istnieje operacja wk(x) taka, że wj(x)< wk(x) <ri(x) to aj< ri(x)  Ti czyta z transakcji Tj w harmonogramie H jeżeli Ti czyta dowolną daną z transakcji Tj w harmonogramie H dr Paweł Drozda Harmonogram odtwarzalny  Harmonogram H jest odtwarzalny (RC) wówczas, jeżeli Ti czyta z Tj w harmonogramie H i ci należy do H to cj<ci  Harmonogram H unika kaskadowych wycofań (ACA) wówczas, jeżeli transakcja Ti czyta z Tj, to cj<ri(x)  Harmonogram H jest ścisły (ST) wówczas, jeżeli wj(x)<oi(x), zachodzi aj<oi(x) lub cj<oi(x), gdzie oi(x) jest jedną z operacji ri(x) lub wi(x) dr Paweł Drozda Odtwarzalność - przykład T1= w1(x) w1(y)w1(z)c1 T2= r2(u)w2(x) r2(y)w2(y)c2 H1 = H2= H3 = H4 = w1(x)w1(y)r2(u)w2(x)r2(y)w2(y)c2w1(z)c1 w1(x)w1(y)r2(u)w2(x)r2(y)w2(y)w1(z)c1c2 w1(x)w1(y)r2(u)w2(x)w1(z)c1r2(y)w2(y)c2 w1(x)w1(y)r2(u)w1(z)c1w2(x)r2(y)w2(y)c2 H1 – nie odtwarzalna, H2 – RC, H3 – RC, ACA, H4 – RC,ACA,ST dr Paweł Drozda Odtwarzalność - zależności ST  ACA  RC dr Paweł Drozda Algorytmy zarządzania współbieżnym wykonaniem transakcji  blokowanie - uszeregowanie transakcji wynika z kolejności uzyskiwanych blokad  znaczników czasowych – uszeregowanie wynika z wartości znaczników czasowych związanych z transakcjami  optymistyczne – walidacja poprawności uszeregowania dr Paweł Drozda Blokowanie (1)  Blokada – zmienna skojarzona z każdą daną w bazie; określa możliwość wykonania określonych operacji  Możliwe stany:  dana nie zablokowana  dana zablokowana do odczytu R  dana zablokowana do zapisu W dr Paweł Drozda Blokowanie (2)  Operacje SZBD związane z blokowaniem:  Blokowanie danej x do odczytu (LR(x))  Blokowanie danej x do zapisu (LW(x))  Odblokowanie danej x (UNL(x))  Operacje blokowania muszą poprzedzać operacje odczytu lub zapisu zmiennej dr Paweł Drozda Blokowanie (3)  Dwie blokady są kompatybilne, gdy mogą być założone na jednej danej przez dwie różne transakcje (tylko dwie blokady odczytu są kompatybilne)  Konwersja blokad – zmiana typu blokady. Niedopuszczalna konwersja z blokady do zapisu na blokadę do odczytu dr Paweł Drozda Algorytm blokowania (1)  Dla każdej danej dwie kolejki:  Transakcji, które uzyskały dostęp do danej  Transakcji oczekujących na dostęp do danej dana idt blokada x1 T1 W x2 T1 R x2 T2 R x3 T2 W dana idt blokada kolejka x1 T2 R 1 x1 T3 W 2 x2 T4 W 1 dr Paweł Drozda Algorytm blokowania (2)  Potrzebne funkcje  Założenie blokady do odczytu – gdy dana niezablokowana lub zablokowana do odczytu– założenie blokady, w przeciwnym razie transakcja czeka w kolejce  Założenie blokady do zapisu – gdy dana jest niezablokowana – założenie blokady, w przeciwnym razie do kolejki  Zdjęcie blokady dr Paweł Drozda Algorytm blokowania - przykład T1 T2 Rlock(T1,Y) Rlock(T2,X) r(Y) r(X) unlock(Y) unlock(X) Wlock(T1,X) Wlock(T2,Y) r(X) r(Y) X=X+Y Y=X+Y w(X) w(Y) unlock(X) unlock(Y) X=20, Y=30 Współbieżnie: X=50, Y=50 Sekwencyjnie T1T2 X=50, Y=80 Sekwencyjnie T2T1 X=70, Y=50 dr Paweł Drozda Zakleszczenie transakcji  Gdy dwie transakcje czekają T1 T2 Rlock(T1,Y) r(Y) Rlock(T2,X) r(X) Wlock(T2,Y) Wlock(T1,X) wait wait wait wait wait … … dr Paweł Drozda Metody wykrywania i rozwiązywania zakleszczeń  Za pomocą grafu:  transakcje jako węzły  oczekiwanie transakcji Ti na daną zablokowaną przez Tj reprezentowane przez krawędź skierowaną  cykl w grafie oznacza zakleszczenie  eliminacja – wycofanie jednej z transakcji cyklu  graf sprawdzany  jeśli transakcja czeka zbyt długo – przekroczyła ustalony limit czasu  co określony czas dr Paweł Drozda Poziomy izolacji (1)  Większość SZBD nie zapewnia szeregowalności transakcji  Poziom izolacji wprowadzany do znalezienia kompromisu pomiędzy współbieżnością a poprawnością wykonania transakcji  Możliwe poziomy izolacji:     READ UNCOMMITTED READ COMMITED REPEATABLE READ SERIALIZABLE dr Paweł Drozda Poziomy izolacji (2)  SERIALIZABLE  Odczytuje wyłącznie dane zatwierdzone  Do momentu zakończenia transakcji żadna dana nie zostanie zmieniona przez inną transakcje  Blokuje dostęp do tabeli  Zapewnia szeregowalność  REPEATABLE READ  Tak samo jak SERIALIZABLE – tylko, że blokuje dostęp do danych a nie całej tabeli  Pojawia się problem „fantomów” – gdy jedna transakcja czyta dane, druga w tym samym czasie dodaje lub uaktualnia dr Paweł Drozda Poziomy izolacji (3)  READ COMMITTED  Odczytuje tylko zatwierdzone dane  Zapisane dane nie zostaną zmienione przez inną transakcję do momentu zakończenia transakcji  Brak gwarancji, że dane odczytane nie zostaną zmienione przez inną transakcję  Problem niepowtarzalnego odczytu – gdy ta sama dana jest czytana dwa razy a w międzyczasie inna transakcja ją modyfikuje dr Paweł Drozda Poziomy izolacji (4)  READ UNCOMMITTED  Dopuszczenie odczytywania danych, które zostały zmienione przez niezatwierdzone transakcje – może czytać dodane wiersze które później będą wycofane (Czytanie na brudno)  Najniższy poziom izolacji  Poziom izolacji SQL – ustawiany przed uruchomieniem transakcji SET TRANSACTION ISOLATION LEVEL (SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED) Sprawdzanie poziomu izolacji dla sesji: select @@session.tx_isolation; dr Paweł Drozda Poziomy izolacji - zestawienie Czytanie na brudno Niepowtarzalny odczyt Fantom READ UNCOMMITED możliwe możliwe możliwe READ COMMITED Nie występuje możliwe możliwe REPEATABLE READ Nie występuje Nie występuje możliwe SERIALIZABLE Nie występuje Nie występuje Nie występuje dr Paweł Drozda Transakcje – SQL (1)  Dostępne dla parametru engine ustawionego na InnoDB (podobnie jak przy wymuszaniu więzów integralności referencyjnej) CREATE TABLE Studenci(…) engine=InnoDB;  Dwa tryby pracy z transakcjami  autocommit – każda operacja od razu zatwierdzana (chyba, że się zaznaczy transakcje)  Bez autocommit – możliwość grupowania poleceń w transakcję (konieczność potwierdzania commit lub wycofania rollback) dr Paweł Drozda Transakcje – SQL (2)  Ustawienie autocommit:  SET AUTOCOMMIT =1; - domyślnie  SET AUTOCOMMIT =0; - możliwość grupowania instrukcji w transakcje  Zmiana ustawienia na stałe:  Zapis w pliku my.ini lub my.cnf w sekcji [mysqld] init_connect=‘SET AUTOCOMMIT=0’  Sprawdzenie ustawienia trybu autocommit:  SELECT @@AUTOCOMMIT; dr Paweł Drozda Transakcje SQL (3)  Polecenia:  START TRANSACTION – rozpoczyna transakcje  AUTOCOMMIT=0 – START TRANSACTION niepotrzebne – uruchamiane automatycznie  AUTOCOMMIT=1 – START TRANSACTION uruchamia transakcje, COMMIT lub ROLLBACK kończy blok transakcji  COMMIT – zatwierdza wykonanie transakcji  ROLLBACK – wycofuje transakcje dr Paweł Drozda Transakcja przykład Student(id,nazwisko,rok) SET AUTOCOMMIT=0; UPDATE Student set rok=rok+1; INSERT INTO Student VALUES(123,’Nowak’,3); EXIT; - zmiany niezachowane COMMIT; EXIT; - zmiany zachowane SET AUTOCOMMIT=1; UPDATE Student set rok=rok+1; START TRANSACTION; INSERT INTO Student VALUES(123,’Nowak’,3); ROLLBACK; insert niezachowany, update zachowany dr Paweł Drozda Transakcje SQL (4)  Blokowanie wierszy dla InnoDB:  Blokowanie do aktualizacji:  SELECT … FROM … WHERE … FOR UPDATE;  Blokowanie do czytania:  SELECT … FROM … WHERE … LOCK IN SHARE MODE; dr Paweł Drozda Transakcje - przykład AUTOCOMMIT=1; BEGIN TRANSACTION; SELECT rok FROM Student FOR UPDATE; UPDATE Student SET rok=rok+1; COMMIT; AUTOCOMMIT=1; BEGIN TRANSACTION; SELECT * FROM Student WHERE nazwisko=‘kowal’ LOCK IN SHARE MODE; INSERT INTO Oceny VALUES(1,2,4); COMMIT; dr Paweł Drozda Transakcje SQL (5)  Blokowanie tabel – dla parametru engine ustawionego na MyISAM – domyślnie  Polecenia:  LOCK TABLES tabela1 typBlokady, …;  typBlokady = READ|WRITE  UNLOCK TABLES; - odblokowuje dostęp do tabel dr Paweł Drozda Transakcje – przykład Sesja1 sesja2 LOCK TABLES Student READ, Oceny WRITE; SELECT * FROM Student; - zostanie wykonana SELECT * FROM Oceny; - czeka na odblokowanie tabeli Oceny UNLOCK TABLES; wykonanie zapytania dr Paweł Drozda