BAZY DANYCH Transakcje opracowanie: Michał Lech
Plan wykładu 1. Transakcje - co to jest? 2. Mechanizmy transakcji 3. Reguły ACID 4. Niekorzystne zjawiska 5. Poziomy izolacji 6. Polecenia PostgreSQL transakcji 7. Jak tworzyć transakcje?
Transakcje - co to jest? Transakcje - zespół operacji, które powinny być wykonane w całości lub w ogóle Przykład transakcji - przelew bankowy
Transakcje - co to jest? Transakcja 1 Transakcja 2 t0 konto = Odczyt; t1 konto = Odczyt; t2 konto = konto + 1000; t3 konto = konto + 1000; t4 Zapis; t5 Zapis;
Mechanizmy transakcji 3 etapy transakcji: rozpoczęcie wykonanie zamknięcie
Mechanizmy transakcji W zaawansowanych systemach wykonywanych jest jednocześnie wiele transakcji (np. system bankowy) Część operacji musi być wykonywana w określonej kolejności Istotne jest, aby operacji transakcyjne trwały jak najkrócej
Mechanizmy transakcji Logowanie transakcji kaŝdy etap transakcji jest logowany, dzięki czemu moŝliwe jest odtworzenie stanu bazy danych sprzed transakcji, która nie została zamknięta (np. w wyniku awarii systemu)
Reguły ACID A - atomicity - atomowość transakcji oznacza, Ŝe kaŝda transakcja musi być wykonana albo w całości albo w ogóle C - consistency - spójność oznacza, Ŝe po wykonaniu transakcji system pozostanie spójny; integralność nie zostanie naruszona I - isolation - jeśli transakcje wykonują się współbieŝnie to nie widzą zmian przez siebie wprowadzanych; istnieją róŝne poziomy izolacji D - durability - trwałość oznacza, Ŝe system potrafi uruchomić się i udostępnić spójne dane, zapisane w ramach transakcji, na przykład po awarii systemu; efekty wykonania transakcji są trwałe
Niekorzystne zjawiska Negatywne zjawiska podczas współbieŝnego wykonywania transakcji na tych samych danych: utracona zmiana (ang. lost update) zmiany wprowadzone przez jedną z transakcji są tracone brudny odczyt (ang. dirty read) transakcja odczytuje dane zapisane przez inną, niezatwierdzoną transakcję niepowtarzalny odczyt (ang. non-repeatable read) w trakcie dwukrotnego odczytu tych samych danych mogą one ulec zmianie (w trakcie tej transakcji zostały zmodyfikowane przez inną, zatwierdzoną transakcję) niewidzialne wiersze (ang. phantom rows)
Niekorzystne zjawiska Utracona zmiana (ang. lost update) t Transakcja 1 Transakcja 2 t1 Odczyt t2 Odczyt t3 Zmiana t4 Zmiana t5 Commit t6 Commit Zmiany wykonane przez transakcję 2 są utracone.
Niekorzystne zjawiska Brudny odczyt (ang. dirty read) t Transakcja 1 Transakcja 2 t1 Odczyt t2 Zmiana t3 Odczyt t4 Rollback t5 Commit Transakcja 1 odczytuje dane po zmianie wykonanej przez operacje transakcji 2, ale kolejną operacją transakcji 2 jest wycofanie, zatem to co odczytała transakcja 1 faktycznie nigdy nie zaistniało.
Niekorzystne zjawiska Niepowtarzalny odczyt (ang. non-repeatable read) t Transakcja 1 Transakcja 2 t1 Odczyt t2 Odczyt t3 Zmiana t4 Odczyt t5 Commit t6 Commit Transakcja 1 odczytuje dwukrotnie ten sam wiersz, ale za drugim razem otrzymuje inne dane.
Niekorzystne zjawiska Niewidzialne wiersze (ang. phantom rows) t Transakcja 1 Transakcja 2 t1 t2 t3 SELECT * FROM Autorzy WHERE imie = Stefan ; SELECT * FROM Autorzy WHERE imie = Stefan ; INSERT INTO Autorzy(imie) VALUES ( Stefan ) ; W czasie t4 transakcja 1 widzi dane, mimo Ŝe wcześniej (t1 = t) ich nie widziała (w jej trakcie zostały dodane przez transakcję 2).
Poziomy izolacji Poziom izolacji określa jak bardzo wykonanie jednej transakcji jest niezaleŝne od wykonania innej (jakie negatywne zjawiska są dopuszczalne), w sytuacji kiedy transakcje wykonywane są współbieŝnie
Poziomy izolacji Read uncommitted - transakcja moŝe odczytywać dane, na których operują inne transakcje Read committed - transakcja moŝe odczytywać tylko dane zapisane Repeatable read - transakcja nie moŝe czytać ani zapisywać danych, odczytywanych bądź zapisywanych w tym samym momencie przez inną transakcję Serializable - pełna izolacja
Poziomy izolacji Poziom Brudny odczyt Niepowtarzalny odczyt Read uncommitted Niewidzialne wiersze moŝliwy moŝliwy moŝliwe Read committed moŝliwy moŝliwe Repeatable read MoŜliwe Serializable
Poziomy izolacji Read uncommitted UŜywane z trybem dostępu READ ONLY UŜywane dla długich transakcji, kiedy nie potrzebujemy 100% poprawnych wyników
Poziomy izolacji Read committed Kompromis pomiędzy wydajnością, a poziomem izolacji
Poziomy izolacji Repeatable read ObniŜona wydajność Poziom stosowany, kiedy wykonywanych jest wiele zmian jednocześnie
Poziomy izolacji Serializable 100% poprawności NajniŜsza wydajność Poziom stosowany kiedy wymagane jest 100% poprawności albo wykonywane są mało złoŝone, szybko wykonujące się transakcje
Poziomy izolacji Transakcje powinny być wykonywane na moŝliwie najniŝszym poziomie izolacji, tak aby zapewnić wymaganą poprawność transakcji, np. Nie naleŝy uŝywać SERIALIZABLE tam gdzie wystarczy READ COMMITED (wydajność)
Polecenia PostgreSQL transakcji BEGIN - rozpoczęcie transakcji START TRANSACTION - j.w. COMMIT - zatwierdzenie transakcji; zapisanie w bazie rezultatów działania operacji transakcyjnych ROLLBACK - zakończenie transakcji bez zapisywania rezultatów (wycofanie wszystkich zmian) lub powrót do wskazanego punktu [TO SAVEPOINT nazwa]
Polecenia PostgreSQL transakcji START TRANSACTION [tryb_transakcji] gdzie tryb_transakcji: ISOLATION LEVEL { SERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED } READ WRITE READ ONLY
Polecenia PostgreSQL transakcji START TRANSACTION [tryb_transakcji] gdzie tryb_transakcji: ISOLATION LEVEL { SERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED } READ WRITE READ ONLY
Polecenia PostgreSQL transakcji SET TRANSACTION transaction_mode [,...] SET TRANSACTION ustawia sposób działania bieŝącej transakcji. Nie ma wpływu na następne transakcje.
Polecenia PostgreSQL transakcji SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [,...] SET SESSION CHARACTERISTICS ustawia domyślny poziom izolacji dla wszystkich transakcji w sesji. Poziom ten moŝe zostać przedefiniowany przez SET TRANSACTION dla kaŝdej pojedynczej transakcji.
Polecenia PostgreSQL transakcji W Postgresie: READ UNCOMMITTED = READ COMMITTED REPEATABLE READ = SERIALIZABLE Domyślnie: READ COMMITTED
Jak tworzyć transakcje? Przykład: 1. Odczyt danych z bazy 2. Wyświetlenie danych 3. Wpisywanie przez uŝytkownika nowych danych w udostępniony formularz 4. Aktualizacja danych w bazie Problem: W którym miejscu naleŝy zacząć transakcję?
Jak tworzyć transakcje? Rozwiązanie: PoniewaŜ krok 3 moŝe trwać bardzo długo transakcję naleŝy rozpocząć dopiero w kroku 4. NaleŜy sprawdzić czy dane uprzednio pobrane i wyświetlone nie zostały w międzyczasie zmienione przez inną transakcję.
Jak tworzyć transakcje? Rozwiązanie (c.d.): 1. Odczyt danych 2. Wyświetlenie danych i zapamiętanie ich 3. Wpisywanie przez uŝytkownika nowych danych w udostępniony formularz 4. START TRANSACTION 5. Ponowny odczyt danych 6. Porównanie odczytanych danych z danymi zapamiętanymi 7. Wykonanie COMMIT jeśli są takie same, jeśli inne to albo COMMIT albo ROLLBACK (zaleŝnie od specyfiki operacji) i powiadomienie uŝytkownika o takiej sytuacji
Jak tworzyć transakcje? Rozwiązanie (c.d.): Poziom izolacji: REPEATABLE READ lub SERIALIZABLE (czyli w postgresie SERIALIZABLE)