444 7. SYSTEMOWI! ASPEKTY JĘZYKA SQI.
Jak bardzo istotny jest fakt, że odczytano wartości z brudnopisu? W przykładzie 7.15 było to bardzo ważne, ponieważ nastąpiło wpisanie na konto salda ujemnego, czego próbowano uniknąć. Jednakże już w przykładzie 7.16 problem nie wydaje się bardzo poważny. Klient może uzyskać informację o tym, że nic ma miejsca, które mu odpowiada, albo że wcale nie ma miejsca na dany lot. Jednakże kolejne uruchomienie transakcji spowoduje, że uzyska on dostęp do miejsca S. A więc w przypadku funkcji z tego przykładu udostępnienie możliwości czytania brudnopisu może mieć sens, transakcje bowiem będą wykonywały się wówczas dużo szybciej, co zmniejszy średni czas dokonywania rezerwacji.
W systemie SQL2 można określić, że pewna transakcja umożliwia czytanie brudnopisu. Taką deklarację umożliwia stosowna opcja instrukcji SET TRANSACTION, którą omawialiśmy w p. 7.2.4. Dla transakcji z przykładu 7.16 ma ona następującą postać:
1) SET TRANSACTION READ WRITE
2) ISOLATION LEVEL READ UNCOMMITTED; Oznacza ona, że transakcja:
1. Zarówno czyta, jak i zapisuje dane (wiersz 1)).
2. W wierszu 2) określa się, że transakcja może się wykonywać na poziomie izolacji: odczyt niezatwierdzony. W punkcie 7.2.6 zostaną omówione cztery poziomy izolacji, dotychczas mieliśmy do czynienia z dwoma: sekwencyjnym oraz. odczytem niezatwierdzonym.
Zauważmy, że jeśli transakcja nic jest tylko do odczytu (tzn. powoduje zapisanie do bazy-' co najmniej jednej nowej wartości), a poziom izolacji zostanie określony jako READ UNCOMMITTED, to transakcja musi być typu READ WRITE. Przypomnijmy sobie, z p. 7.2.4, że jest to opcja standardowa. Jednakże w systemie SQL2 następuje wyjątek od tej reguły' w przypadku dopuszczenia odczytu brudnopisu. Wówczas zmienia się domniemany typ transakcji na tylko do odczytu, ponieważ, jak już się przekonaliśmy, istnieje duże ryzyko przy transakcjach typu read-write i dopuszczeniem odczytu brudnopisu. A zatem, jeśli chcemy, aby transakcja odczyt-zapis działała na poziomie izolacji - odczyt niezatwierdzony, to opcja READ WRITE musi zostać jawnie zadana, jak to występuje powyżej.
W systemie SQL2 są dostępne cztery poziomy izolacji. Z dwoma mieliśmy już do czynienia: z sekwencyjnym i odczytem niezatw-ierdzonym (dopuszczenie odczytu z brudnopisu). Dwa pozostałe nazywają się odczyt zatwierdzony oraz odczyt powtarzalny. Dla danej transakcji sposób określenia tych poziomów jest następujący:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; i odpowiednio
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Zawsze przez domniemanie transakcje są typu odezyt-zapis, a więc jeśli chcemy to zmienić, to trzeba dołączyć w każdym przypadku opcje READ ONLY. Dopuszczalna jesi także poniższa specyfikacja:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Jest ona jednak przyjęta przez domniemanie, więc nie trzeba jej jawnie deklarować.
Jak to wynika z samej nazwy, poziom izolacji - odczyt zatwierdzony - zabrania odczytu danych z brudnopisu (niezatwicrdzonych). Jednakże można wówczas powtarzać wielokrotnie to samo zapytanie, otrzymywać rożne odpowiedzi tak długo, aż w odpowiedzi znajdą się dane z zatwierdzonych transakcji.
PRZYKŁAD 7.17
Ponownie rozważmy funkcję rezerwacji miejsc w samolocie z przykładu 7.16, ale teraz będzie ona wykonywana przy poziomie izolacji określonym jako odczyt zatwierdzony. W chwili wyszukiwania wolnego miejsca (punkt 1) nie będą widoczne w'cale te miejsca, które są zarezerwowane przez inne transakcje, ale jeszcze nie są zatwierdzone*. Jeśli jednak klient zrezygnuje z tego miejsca i funkcja będzie powtarzała zapytania o wolne miejsca cyklicznie, to za każdym razem może być w wyniku podany inny zbiór miejsc, poniew'aż w ty m samym czasie inne transakcje również dokonują rezerwacji i je wycofują.
□
Teraz z kolei rozważymy poziom izolacji - odczyt powtarzalny. Tym razem nazwa jest nieco myląca, ponieważ powtórzenie zapytania nie gwarantuje wcale otrzymania tej samej odpowiedzi. Przy tym poziomie izolacji, jeśli jakaś krotka zostanie odczytana przy pierwszym wykonaniu zapytania, to w powtórnej odpowiedzi też ona wystąpi. Jednakże może się zdarzyć również, że do kolejnych odpowiedzi będą dołączane krotki - fantomy. Są to takie krotki w bazie, które powitają w wyniku wstaw iania dokonywanego przez inne transakcje.
’ To. co teraz się stanie, może wyglądać nieco magicznie, ponieważ w algorytmie nic przewidywaliśmy wymuszenia poziomów izolacji. Najprawdopodobniej, jeśli dwie transakcje jednocześnie będą chciały rezerwować to samo miejsce, jedna z nich będzie zmuszona przez, system do przerwania działania, nawet jeśli nic występuje tam instrukcja ROLLBACK.