transakcja

Serializable – transakcje w Oracle

W poprzednim artykule została omówiona izolacja transakcji  Read Commited w Oracle. W dzisiejszym artykule zajmę się przedstawieniem izolacji transakcji Serializable również na przykladzie Oracle.

1. Poziomy izolacji ogólny pogląd.

Przypomnijmy sobie tabelkę ze zestawieniem wszystkich izolacji i ich problemów jakie mogą powstać.

Sql: poziomy izloacji transakcji i dozwolne operacje
Sql: poziomy izloacji transakcji i dozwolne operacje

2.1 Serializable – Phantom Read.

Ten typ izolacji jest najbardziej restrykcyjny ze wszystkich. Tutaj transakcje ustawiają się w kolejce i czekają aż transakcja przed nimi się zakończy albo poprzez commit albo poprzez rollback. Jak widać powyżej wszystkie problemy zostały rozwiązane. Jednak wiążę się  to ze spadkiem wydajności pracy bazy danych. Zobaczmy to więc na przykładzie.

Zarówno w sesji nr.1 jak i sesji nr.2 ustawiłam izolacje na serializable. Pobrałam aktualny stan tabeli employees, sprawdziłam czas. Następnie w sesji nr.1 przystąpiłam do modyfikacji tabeli poprzez wstawianie nowego pracownika z id = 6.

izolacja serializable w oracle sesja nr1
Izolacja transakcji Serializable w Oracle sesja nr1. Odczytanie danych, wstawienie nowego rekordu i ponowny odczyt danych.

Następnie odczytałam dane w sesji nr.2 które na tym etapie są identyczne z danymi w sesij nr.1.

izolacja serializable w oracle sesja nr2
Izolacja transakcji Serializable w Oracle sesja nr2. Odczytanie danych początkowych w sesji nr.2

Jak możemy zobaczyć poniżej nie zatwierdzona transakcja nie jest widoczna w sesji nr.2. Jak do tej pory wszystko przebiega podobnie do isolation_level = Read commited. Jednak po zatwierdzeniu transakcji w sesji nr.1 i ponownym sprawdzeniu bazy w sesji nr.2 dalej nie widzimy dodanego pracownika z id = 6. Dzieje się tak ponieważ w sesji nr.2 nie skończyliśmy transakcji odczytu i dlatego zakończenie transakcji w sesji nr.1 nie aktualizuje nam informacji w sesji nr.2. Wynika to z faktu że operacja wstawienia dodatkowego wiersza  (sesja nr.1) była by fantomem (phantom read) w sesji nr.2 a to na poziomie serializable jest niedozwolone. Dlatego też koniecznym jest zakończenie bieżącej operacji w sesji nr.2 np. wpisując commit i ponowne odczytanie danych w nowej transakcji.

izolacja serializable w oracle sesja nr2
Izolacja transakcji Serializable w Oracle sesja nr2. Odczytanie danych po zatwierdzeniu operacji w sesji nr.1, sprawdzenie czasu, zakończenie odczytu danych w sesji nr.2 i ponowne sprawdzenie danych w sesji nr.2

2.2 Serializable – Non Reapatable Read.

Podobnie sytuacja wygląda w przypadku Non Repeatable Read. Aby aktualizacja danych pomiędzy sesjami była możliwa obie sesje powinny zostać zakończone. Przykładowo dokonujemy zmian na rekordzie danych o id =6.

Izolacja transakcji Serializable w Oracle sesja nr1. Modyfikacja danych
Izolacja transakcji Serializable w Oracle sesja nr1. Modyfikacja danych .

Następnie zanim zatwierdzimy zmiany sprawdzamy stan danych w sesji nr. 2. Jak możemy zobaczyć poniżej zmiany nie są jeszcze widoczne.

Sprawdzenie czy w sesji nr.2 są widoczne zmiany z sesji nr.1 przed zatwierdzeniem transakcji w sesji nr.2
Sprawdzenie danych w sesji nr.2 przed zatwierdzeniem transakcji w sesji nr.1 i sesji nr.2

Następnie dopiero po zakończeniu transakcji w obu sesjach zmiany są widoczne w sesji nr.2

Sprawdzenie danych w sesji nr.2 po zatwierdzeniu transakcji w sesji nr.1 i sesji nr.2.
Sprawdzenie danych w sesji nr.2 po zatwierdzeniu transakcji w sesji nr.1 i sesji nr.2.
 
W serializable wszystko odbywa się według kolejności.

3. Podsumowanie.

W dzisiejszym artykule nauczyliśmy że Serializable wszystko odbywa się według kolejności.  I choć jest to skuteczny sposób na rozwiązanie problemów: Phantom Read i Non Reapatable Read to jednak może to prowadzić do spadku wydajności bazy danych. Pojawić się tutaj może również zjawisko deedlock. Jednak o tym w jednym z kolejnych artykułów. A jakie Ty tym masz doświadczenia z tego typu operacjami? Koniecznie podziel się w komentarzu 🙂 !

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *