7. SYSTEMOM ASPEKTY JĘZYKA SOL
Można także poinformować system SQL o tym, żc transakcja powoduje zapis nowych wartości w bazie i stosuje się wówczas następującą instrukcję:
SET TRANSACTION READ WRITE;
Jednakże jest to opcja, która zazwyczaj występuje w języku $QL przez domniemanie, a zatem przew ażnie nie trzeba jej stosować.
Rrudnopis jest popularnym terminem dla danych zapisanych przez transakcję, która jeszcze nie została zatw ierdzona. Czytanie brudnopisu oznacza po prostu czytanie danych brudnopisu. Ryzyko przy czytaniu tych danych polega na tym, że w końcowym efekcie transakcja może nic zostać zatwierdzona. Jeśli tak się stanie, to dane brudnopisu zostaną usunięte z bazy danych i wszystkie funkcje powinny dawać takie wyniki, jakby tych danych nigdy nie było w bazie. Jeśli jednak jakieś inne transakcje odczytały' dane z brudnopisu, który' został w rezultacie usunięty, to mogłoby to spowodować niekorzystne konsekwencje.
Niekiedy odczytanie danych z brudnopisu ma znaczenie. A niekiedy ryzyko jest tak niewielkie, że warto skorzystać z tej możliwości przy' czasochłonnym przetwarzaniu i uniknąć w ten sposób dodatkowych czynności związanych z ochroną przed czytaniem brudnopisu. Poniżej przedstawiamy przykłady, które ilustrują, co może się zdarzyć w przypadku dopuszczenia odczytu brudnopisu.
PRZYKŁAD 7.15
Rozważmy ponownie przelew' między kontami bankowymi z przykładu 7.12. Teraz załóżmy, że przelew jest dokonywany za pomocą programu P, którego działanie można opisać w następujących punktach:
1. Dodaj pieniądze do konta 2.
2. Sprawdź, czy na koncie 1 jest wystarczająco dużo pieniędzy.
a) Jeśli nic, to usuń dodane pieniądze z konta (2) i cofnij transakcję.
b) Jeśli pieniędzy wystarcza, to odejmij właściwą kwotę od salda z konta 1 i zatwierdź transakcję.
Jeśli program P wykonuje się sekwencyjnie, to wówczas nie ma znaczenia fakt, że na koncie 2 chwilowo może być za dużo pieniędzy-. Nikt o tym nie będzie wiedział, a jeśli przelew' nie dojdzie do skutku, to zostaną one usunięte.
Załóżmy z kolei, że dopuszcza się czytanie brudnopisu. Wyobraźmy sobie, żc istnieją trzy konta Al, A2 i A3, z saldami odpow iednio: 100 $, 200 $ i 300 S. Załóżmy, że transakcja T, ma powodować, wykonując program P, przelew 150 $ z konta A1 na A2. A w tym samym czasie transakcja T2 ma wykonać program P po to, by dokonać przelewu 250 $ z A2 na A3. Poniżej przedstawiamy potencjalnie możliwy ciąg zdarzeń:
1. Ti wykonuje pierwszy punkt i dodaje kwotę 250 $ do A3, gdzie saldo wynosi teraz 550 $.
2. T\ wykonuje pierwszy punkt i dodaje 150 $ do A2, gdzie saldo wyniesie 350 $.
3. Ti wykonuje sprawdzenie z punktu 2, na koncie A2 jest dostateczna suma (350 S), co umożliwia przelew 250 $ z A2 na A3.
4. T\ wykonuje sprawdzenie z punktu 2, na koncie Al nie ma wystarczająco dużo pieniędzy (100 $), aby dokonać przelewu z Al na A 2.
5. T2 wykonuje punkt 2b. Odejmuje 250 S od A2, gdzie teraz pozostaje 100 $, a transakcja '1\ zostaje zatwierdzana.
6. T\ wykonuje punkt 2a. Od A2 zostaje odjęta kwota 150 S i zostaje tam teraz -50 $. Transakcja T\ zostaje cofnięta.
Ogólna kwota na trzech kontach AL A2 i A3 nie zmieniła się w wyniku tych działań, wynosiła i wynosi nadal 600 $. Jednakże, ponieważ w trzecim z sześciu wykonywanych działań transakcja T2 dokonała odczytu wartości z brudnopisu, zatem nie dało się uchronić salda przed zapisem wartości ujemnej, co było celem testu zapisanego w punkcie 2 programu P.
□
PRZYKŁAD 7.16
Kolejny przykład stanowi modyfikację funkcji rezerwującej miejsce w samolocie, którą omawialiśmy już w podrozdziale 7.11. Oto nowy algorytm:
1. Znaleźć wolne miejsce i zarezerwować je, nadając zmiennej rezerwacja wartość 1. Jeśli nie ma wolnego miejsca, to odwołać transakcję.
2. Sprawdzamy, czy klient akceptuje zarezerwowane miejsce. Jeśli tak, następuje zatwierdzenie. Jeśli nie, to zwalniamy miejsce, nadając zmiennej rezerwacja wartość 0 i powtarzamy punkt I po to, by zarezerwować inne miejsce.
Załóżmy, że ten algorytm jest przetwarzany jednocześnie przez dwie transakcje i jedna z nich zarezerwowała miejsce S, które potem nie zostało zaakceptowane przez klienta. Jeśli w trakcie przetwarzania punktu 1 druga transakcja uzyskała informację o tym, żc .Sjest zarezerwowane, to jej klient nie będzie w efekcie mógł z lego miejsca skorzystać.
Tak jak w przykładzie 7.15 tego kłopotu można uniknąć, gdyby zabronić czytania z brudnopisu. Niekorzystny bowiem wynik został spowodowany tym, że druga transakcja uzyskała dostęp do danych modyfikowanych przez niezatwierdzoną transakcję.
□