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.