Transakcje
Transkrypt
Transakcje
Transakcje Nieoczekiwany stan bazy danych lub awaria. Przykład: obsługa kont bankowych. Relacja nazywa się Konta i ma dwa artybuty: NrKonta i saldo. Chcemy, aby funkcja przelew() dokonywała przelewu pewnej ustalonej kwoty z jednego konta na inne, o ile jest to możliwe, to znaczy, o ile saldo z pierwszego konta nie jest niższe od zadanej kwoty. Poniżej przedstawiono szkic funkcji przelew(). exec sql begin declare section; int konto1, konto2; int saldo1; /*kwota na pierwszym koncie*/ int kwota; /*kwota przelewu*/ exec sql end declare section; void przelew(){ /*wprowadzenie wartości dla zadeklarowanych zmiennych*/ exec sql select saldo into :saldo1 from Konta where numerKonta=:konto1; if (saldo1 >= kwota){ exec sql update Konta set saldo=saldo+:kwota where numerKonta=:konto2 exec sql update Konta set saldo=saldo-:kwota where numerKonta=:konto1; } else /*kod drukujący komunikat, że nie można dokonać przelewu ze względu na zbyt niskie saldo*/ } Przystosuj przedstawiony przykład do własnej bazy danych. Wykorzystaj polecenia: commit, rollback, savepoint do zatwierdzania/wycofywania transakcji. Załóżmy, że funkcja Przelew() ma się wykonywad zawsze jako jednostkowa transakcja. Ta transakcja rozpoczyna się w chwili wczytania salda z pierwszego konta. Jeśli test (w warunku if) przebiegnie pozytywnie i przelew zostanie wykonany, należy zatwierdzid zmiany danych – trwale zapisad je w bazie danych (commit). Jeśli warunek sprawdzania okaże sie fałszywy (saldo na pierwszym koncie zbyt niskie) to trzeba wycofad transakcję (rollback to savepoint). Czytanie brudnopisu. Potrzebne polecenia: set transaction read write, set transaction read only. Rozważmy ponownie podany powyżej przykład. Załóżmy, że przelew jest wykonywany za pomocą programu P, którego działanie można opisad w następujących krokach: 1. Dodaj pieniądze do konta 2. 2. Sprawdź, czy na koncie 1 jest wystarczająco dużo pieniędzy. i. Jeśli nie, usuo dodane pieniądze z konta 2 i zakoocz transakcję. ii. Jeśli pieniędzy wystarcza, odejmij właściwą kwotę od salda z konta 1 i zakoocz transakcję. Jeśli program P wykona się szeregowo, to wówczas nie ma znaczenia fakt, że na koncie 2 chwilowo jest 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, że dopuszcza się czytanie brudnopisu. Wyobraźmy sobie, że istnieją 3 konta: A1, A2 i A3, z saldami odpowiednio: 100PLN, 200PLN i 300PLN. Załóżmy, że transakcja T1 ma powodowad , wykonując program P, przelew 150PLN z konta A1 na A2. W tym samym czasie transakcja T2 ma wykonad program P po to, by dokonad przelewu 250PLN z A2 na A3. Poniżej przedstawiono możliwy ciąg zdarzeo: 1. T2 wykonuje pierwszy punkt i dodaje kwotę 250PLN do A3, gdzie saldo wynosi teraz 2. 3. 4. 5. 6. 550PLN. T1 wykonuje pierwszy punkt i dodaje 150PLN do A2, gdzie saldo wyniesie 350PLN. T2 wykonuj sprawdzenie z punktu 2; na koncie A2 jest dostateczna suma pieniędzy (350PLN), co umożliwia przelew 250PLN z A2 na A3. T1 wykonuje sprawdzenie z punktu 2; na koncie A1 nie ma wystarczająco dużo pieniędzy (100PLN), aby dokonad przelewu z A1 na A2. T2 wykonuje punkt 2ii. Odejmuje 250PLN od A2, gdzie teraz pozostaje 100PLN, a transakcja T2 zostaje zatwierdzona. T1 wykonuje punkt 2i. Od A2 zostaje odjęta kwota 150PLN i zostaje tam teraz -50PLN. Transakcja T1 zostaje cofnięta. Ogólna kwota na trzech kontach A1..A3 nie zmieniła się w wyniku tych operacji, wynosiła i nadal wynosi 600PLN. Jednakże, ponieważ w trzeciej z sześciu wykonywanych operacji transakcja T2 dokonała odczytu wartości z brudnopisu, więc nie dało się uchronid salda przed zapisem wartości ujemnej, co było celem testu z punktu 2 programu P.