Bazy danych 2 Wykład 6 Transakcje
Transakcje Def. Transakcjami nazywamy logiczne jednostki pracy które wprowadzają zmiany do bazy danych lub które wyszukują dane O transakcjach mówimy w kontekście: aktualizacji bazy danych współuŝytkowania danych przez wielu uŝytkowników i powstawania wzajemnych konfliktów Transakcja moŝe obejmować jedną instrukcję lub większą ilość instrukcji.
Właściwości transakcji Niepodzielność albo wszystkie instrukcje wchodzące w skład transakcji są wykonane albo Ŝadna Spójność wszystkie transakcje muszą zachować spójność i integralność bazy danych Izolacja jeśli transakcja modyfikuje dane, to te dane mogą być czasowo niespójne, dlatego muszą być niedostępne dla innych transakcji dopóty, dopóki transakcja nie skończy ich uŝywać Trwałość gdy transakcja się kończy, to wszystkie zmiany przez nią dokonane muszą zostać w pełni utrwalone
Transakcja sekwencja logiczna Logiczna sekwencja jest następująca [BEGIN [WORK]/ START TRANSACTION [nazwa_transakcji] Wykonaj polecenie 1 ROLLBACK [WORK] [TRANSACTION] (baza danych powraca do stanu pierwotnego) [BEGIN [WORK]/ START TRANSACTION [nazwa_transakcji] Wykonaj polecenie 1 SAVEPOINT nazwa Wykonaj polecenie 2 Wykonaj polecenie 3 ROLLBACK TO SAVEPOINT nazwa Wykonaj polecenie 4 COMMIT [WORK] [TRANSACTION] (zmiany zostają zapisane w bazie)
Transakcja z punktami zapisu Przykład BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; SAVEPOINT my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob'; ROLLBACK TO my_savepoint; UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Wally'; COMMIT TRANSACTION;
UWAGI Standard SQL nie definiuje frazy BEGIN. Transakcje w tym standardzie rozpoczynają się bowiem automatycznie wraz z wykonaniem pierwszej instrukcji. W programistycznym SQL zakończenie programu kończy z powodzeniem takŝe ostatnią transakcję, nawet jeŝeli nie zostało wydane polecenie COMMIT, zaś zakończenie z błędem powoduje wycofanie aktualnej transakcji.
Problem utraty zmian Przyczyna zaburzeń: Transakcja T 1 czyta dane podczas, gdy są one modyfikowane przez transakcję T 2
Problem niezatwierdzonych zaleŝności (brudny odczyt) Przyczyna zaburzeń: Transakcja T 3 jest wykonywana przy załoŝeniu, Ŝe modyfikacja wykonana przez przez transakcję T 4 została zakończona z powodzeniem
Problem analizy niespójności Przyczyna zaburzeń: Transakcja T 6 czyta dane, które są modyfikowane przez transakcję T 5
Kontrola współbieŝności Uwaga: DBMS powinien zapewniać pewien mechanizm umoŝliwiający zarządzanie operacjami wykonywanymi jednocześnie na bazie danych bez dopuszczania do niepoŝądanych oddziaływań pomiędzy nimi. Jednym z nasuwających się rozwiązań jest zezwolenie na wykonywanie tylko jednej transakcji w danym czasie; takie postępowanie jednak w znacznym stopniu wpływa na wydajność bazy danych. Rozwiązaniem lepszym (w kontekście wydajności) jest jakaś forma przeplatania transakcji, wiąŝe się z tym pojęcie szeregowalności [Papadimitriou, 1979]
Pojęcie szeregowalności Def. Harmonogram jest to ciąg operacji wykonywanych jednocześnie transakcji, w których zachowany jest porządek operacji kaŝdej transakcji. Def. Harmonogram sekwencyjny to harmonogram, w którym operacje kaŝdej transakcji są wykonywane kolejno, bez przeplatania operacji z róŝnych transakcji. W przypadku harmonogramu sekwencyjnego transakcje nie oddziaływają na siebie, poniewaŝ w danym czasie jest wykonywana tylko jedna transakcja. Kolejność transakcji nie jest ustalona, zatem wynik kaŝdego sekwencyjnego wykonania transakcji nie musi być taki sam. Def. Harmonogram niesekwencyjny jest to harmonogram, w którym operacje ze zbioru jednocześnie wykonywanych transakcji, są przeplecione.
Pojęcie szeregowalności Def. Harmonogram wykonywanych jednocześnie transakcji nazywamy szeregowalnym jeśli doprowadza on do takiego samego stanu bazy danych jak pewne wykonanie sekwencyjne tych transakcji. Fakt: Harmonogram szeregowalny jest harmonogramem poprawnym, czyli zapewnia takie wykonanie transakcji współbieŝnie nie dopuszczając do niepoŝądanych oddziaływań pomiędzy nimi. Uzasadnienie: Indywidualne transakcje są poprawne Dowolny harmonogram sekwencyjny jest poprawny Zatem harmonogram szeregowalny jest poprawny, bo doprowadza bazę do stanu takiego jak harmonogram szeregowalny.
Pojęcie szeregowalności Dla zapewnienia szeregowalności waŝne jest wzajemne uporządkowanie operacji odczytu i zapisu transakcji: JeŜeli dwie transakcje jedynie czytają ten sam element danych, to ich wzajemna kolejność nie jest istotna JeŜeli dwie transakcje czytają lub zapisują róŝne elementy danych, to nie kolidują ze sobą i ich wzajemna kolejność nie jest istotna. JeŜeli jedna transakcja zapisuje element danych, a druga go odczytuje lub zapisuje, to kolejność wykonania tych transakcji ma znaczenie.
Pojęcie szeregowalności
Techniki kontroli wielodostępu Metoda blokad (często stosowana przez byłego juz posła Andrzeja.L)
Metody oparte na blokadach Metoda oparta na blokadach polega na tym, Ŝe transakcja, która odwołuje się do danych blokuje innym transakcjom dostęp do danych. RozróŜniamy dwa typy blokad: Blokada do odczytu R (read locks) jeŝeli transakcji zostanie przyznana blokada read locks jednostki danych, to transakcja moŝe odczytywać wartość tej jednostki, ale nie moŝe jej zmieniać Blokada do zapisu W (write locks) - jeŝeli transakcji zostanie przyznana blokada write locks jednostki danych, to transakcja moŝe zarówno odczytywać wartość tej jednostki, jak i ją zmieniać Sposób przyznawania działania blokad przedstawia macierz: W R W N N R N Y
Protokól dostępu danych 1. Transakcja, która wymaga dostępu do jednostki danych występuje o przyznanie blokady dzielonej (jeŝeli zamierza jedynie odczytać wartość jednostki) lub blokady wyłącznej (jeŝeli zamierza odczytać i modyfikować wartość jednostki) 2. JeŜeli jednostka nie została wcześniej zablokowana przez inną transakcję, to blokada jest przydzielana transakcji, która o nią występuje. 3. JeŜeli prośba o blokadę jednostki została odrzucona, poniewaŝ jest w konflikcie z blokadą juŝ załoŝoną, to transakcja przechodzi w stan oczekiwania, aŝ blokada zostanie zwolniona. 4. Transakcja utrzymuje blokadę jednostki, aŝ do momentu jej jawnego odwołania w trakcie wykonania lub do czasu zakończenia (poprzez odrzucenie lub wypełnienie).
Protokół dostępu danych - przykład bal x =100 bal y =400 T9 ->T10 bal x =220 bal y =330 T10 ->T9 bal x =210 bal y =340 Stosujemy blokowanie bal x =220 bal y =340 schemat nie jest szeregowalny
Protokól blokowania dwufazowego 2PL Schemat protokołu blokowania dwufazowego jest następujący: 1. Zanim transakcje rozpocznie przetwarzanie jednostki musi uzyskać blokadę tej jednostki; transakcja Ŝąda załoŝenia wszystkich potrzebnych blokad 2. Po zwolnieniu blokady transakcja nie moŝe juŝ nakładać nowych blokad. Twierdzenie (Eswaran i in., 1976) JeŜeli wszystkie transakcje spełniają protokół dwufazowego blokowania, to wszystkie harmonogramy niesekwencyjne są szeregowalne.
2PL zapobieganie utracie zmian
2PL zapobieganie brudnemu odczytowi
2PL zapobieganie wystąpieniu problemu analizy niespójno jności
2PL wydaje się wspaniale ale...
2PL problem (wycofanie kaskadowe) Sztywny 2PL blokady zdejmowane w momencie zakończenia transakcji Ścisły 2PL- blokady wyłączne ( do zapisu) zdejmowane w momencie zakończenia transakcji
2PL problem (zakleszczenie) Metoda wykluczeń transakcja, która wystąpiła o blokadę czeka na nią tylko określony czas Metoda zapobiegania zakleszczeniom system nie dopuszcza do blokady Metoda wykrywania zakleszczeń o odtwarzania system wykrywa zakleszczenie i odrzuca jedną z transakcji, a później ją wznawia
WspółbieŜność w SQL poziomy izolacji Standard SQL nie zawiera Ŝadnych jawnych moŝliwości blokowania, umoŝliwia stosowanie róŝnych poziomów izolacji transakcji od innych transakcji, poziomy izolacji definiowane są na podstawie tego, które z naruszeń szeregowalności dopuszczają.
WspółbieŜność w SQL poziomy izolacji Brudny odczyt (Dirty read): pierwsza transakcja modyfikuje wiersz, a druga go czyta, zanim zmiana została zatwierdzona przez instrukcję COMMIT. Jeśli pierwsza transakcja została anulowana, zmiana nie miała miejsca i druga transakcja przeczytała wiersz, który naprawdę nigdy nie istniał Niepowtarzalny odczyt (Non-repeatable read): pierwsza transakcja czyta wiersz. Druga go usuwa lub modyfikuje i wykonuje COMMIT przed pierwszą. Teraz pierwsza transakcja mogłaby przeczytać ten sam wiersz jeszcze raz i otrzymać inne wyniki zanim zostanie sama zatwierdzona. Odczyt widmo (Phantom): pierwsza transakcja odczytuje wiersze spełniające predykat. Druga wstawia wartości (instrukcja INSERT) lub je modyfikuje (UPDATE) tak, Ŝe one równieŝ spełniają predykat. Następne wykonanie tego samego zapytania przez pierwszą transakcję da inne wyniki.
Współbie bieŝność w SQL poziomy izolacji Poziomy izolacji READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Charakterystyka dozwolone czytanie wierszy z załoŝoną blokadą write lock brak blokady read lock niedozwolone czytanie wierszy z blokadą write lock blokada read lock załoŝona i utrzymywana tylko na czas czytania wiersza niedozwolone czytanie wierszy z blokadą write lock Blokada read lock załoŝona na wszystkie wiersze będące wynikiem zapytania i utrzymywana do końca transakcji niedozwolone czytanie wierszy z blokadą write lock blokada read lock załoŝona na wszystkie wiersze zawierające informacje na zadany temat (nie tylko te spełniajace warunek selekcji)
WspółbieŜność w SQL poziomy izolacji Poziom izolacji Brudny odczyt Niepowtarzalny odczyt Odczyt widmo READ UNCOMMITED TAK TAK TAK READ COMMITED NIE TAK TAK REPEATABLE READ NIE NIE TAK SERIALIZABLE NIE NIE NIE
Definiowanie poziomu izolacji w SQL SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE} Im wyŝszy poziom izolacji tym większe bezpieczeństwo, ale wolniejsze działanie BDMS JeŜeli wszystkie transakcje są na poziomie SERIALIZABLE, to system gwarantuje szeregowalność harmonogramów.
Jawne blokady (zaleŝne od dialektu) Wiersze i tabele moŝna blokować wyłącznie wewnątrz transakcji, po zakończeniu transakcji wszystkie blokady zostaną zwolnione, nie ma sposobu jawnego zwolnienia blokady Blokowanie wierszy spełniających warunek SELECT.. FOR UPDATE Blokowanie tabel LOCK TABLE table-name IN { SHARE EXCLUSIVE } MODE
Dziękuję za uwagę!