Bazy danych – wykład dziewiaty Transakcje

Transkrypt

Bazy danych – wykład dziewiaty Transakcje
Bazy danych – wykład dziewiaty
˛
Transakcje
Konrad Zdanowski
Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
1 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
2 / 42
Problemy współbieżności
Jeśli BD komunikuje sie˛ tylko z jednym użytkownikiem, nie
powstaje problem konfliktowych operacji.
W praktyce BD musza˛ cz˛esto zapewniać równoległość dostepu.
˛
Przykłady: rezerwacje biletów, operacje bankowe, sklepy
internetowe, ...
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
3 / 42
Problemy współbieżności
Rozważmy dwie transakcje:
T1 : read(X), write(X,1), read(Y), write(Y,2);
T2 : read(X), write(X,4), read(Y), write(Y,3);
Jaka˛ wartość beda˛ miały X i Y po zakończeniu działania T1 i T2 ?
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
4 / 42
Problemy współbieżności
Rozważmy ciag
˛ operacji transakcji T1 i T2 :
1
Wczytaj wolne miejsca,
2
Wczytaj wolne miejsca,
3
Rezerwuj miejsce 13,
4
Rezerwuj miejsce 13.
Nie chcemy, żeby T2 zapisała miejsce zajete
˛ już przez T1 .
Nie byłoby problemu, gdyby transakcje wykonywane były jedna po
drugiej (nierealne).
Transakcja T1 powinna zablokować zajety
˛ rekord, transakcja T2
powinna być wycofana (ale nie warto zakładać blokady na wszystkie
wolne miejsca przed wczytaniem ich przez T1 .
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
5 / 42
Transakcje
Definicja 1
Transakcja jest to ciag
˛ operacji na bazie danych, które powinny być
wykonane w sposób atomowy, jak jedna instrukcja.
Jeśli nie bedzie
˛
można wykonac jednej z instrukcji w transakcji,
trzeba anulować efekt wszystkich.
Standard SQL domyślnie wymaga, żeby transakcje traktować jako
przetważane szeregowo. W praktyce implementacje BD pozwalaja˛
na osłabienie tego wymagania w celu zwiekszenia
˛
efektywności.
Transakcje zatwierdzamy przez commit, anulujemy przez
rollback.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
6 / 42
Własności transakcji – ACID
Atomowość (atomicity) – transakcja wykona sie˛ albo w całości
albo wcale,
Spójność (consistency) – przeprowadzi baz˛e danych ze stanu
spójnego do spójnego,
Isolacja (isolation) – wynik jej działania bedzie
˛
niezależny od
innych działajacych
˛
w tym czasie transakcji,
Trwałość (durability) – wyniki jej działania sa˛ trwałe.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
7 / 42
Przyczyny konfliktów
Jeśli dwie transakcje chca˛ zapisać ten sam rekord, to wchodza˛ ze
soba˛ w konflikt.
Źródłem problemów jest też sytuacja, w której jedna transakcja
zapisuje dane, które chce odczytać druga.
Jeśli dwie transakcje tylko odczytuja˛ dane, to nie moga˛ wejść ze
soba˛ w konflikt.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
8 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
9 / 42
Odczyt „brudnych danych”
Rozważmy scenariusz:
T1
update Miejsca set zajete = true
where numer = 13;
T2
select numer from Miejsca
where zajete = false;
no rows selected.
rollback;
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
10 / 42
Odczyt „brudnych danych”
Definicja 2
Odczyt „brudnych danych” ma miejsce kiedy jedna transakcja
odczytuje dane, które zmieniła druga transakcja, która została potem
wycofana.
Uwaga. To sie nie ma prawa zdażyć w BD Oracle.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
11 / 42
Niepowtarzalny odczyt
Rozważmy scenariusz:
T1
T2
select min(a) from r;
MIN(A): 8
delete from r where a=8;
insert into r values (5);
commit;
select max(a) from r;
MAX(A): 5
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
12 / 42
Niepowtarzalny odczyt
Definicja 3
Niepowtarzalny odczyt wystepuje
˛
kiedy transakcja odczytuje dwa razy
te same dane i otrzymuje inne wyniki, gdyż zostały one zmienione
przez inna,
˛ zatwierdzona˛ transakcje.
˛
Transakcja T2 nie odczytała niezatwierdzonych danych, ale otrzymała
niespójne odpowiedzi: max(a) < min(a).
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
13 / 42
Fantomowe dane
Rozważmy scenariusz:
T1
T2
select a from r;
A: 1, 2, 8
insert into r values (5);
commit;
select a from r;
A: 1, 2, 8, 5
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
14 / 42
Fantomowe dane
Definicja 4
Fantomowe dane pojawia˛ sie, kiedy transakcja odczytujac
˛ dwa razy te
same dane otrzymuje za drugim razem wiecej
˛
wyników.
Przy tej anomalii nie wystapiłby
˛
problem typu: max < min.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
15 / 42
Poziomy izolacji transakcji
Wyróżniamy nastepuj
˛ ace
˛ poziomy izolacji transakcji:
Z odczytem niezatwierdzonych danych (uncommited read).
Z odczytem zatwierdzonych danych (commited read).
Z odczytem powtarzalnym (repeatable read).
Sekwencyjny (serializable).
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
16 / 42
Poziomy izolacji transakcji
Dopuszczalność anomalii przy poziomach izolacji:
Poziomy izolacji
niepowtarzalność
uncommited read
„brudne
dane”
tak
tak
dane
fantomowe
tak
commited read
nie
tak
tak
repeatable read
nie
nie
tak
serializable
nie
nie
nie
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
17 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
18 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
19 / 42
Szeregowalność
Niech t, s, w beda˛ zmiennymi transakcji a X , Y , Z , W rekordami w
bazie danych.
Transakcje Ti możemy potraktować jako ciag
˛ instrukcji read(i,X,s),
write(i, X,s).
Ciag
˛ instrukcji r1 , . . . , rn jest szeregowy jeśli wszystkie instrukcje
każdej transakcji wystepuj
˛ a˛ w jednym podciagu.
˛
Ciag
˛ instrukcji r1 , . . . , rn jest szeregowalny jeśli jeśli istnieje
szeregowy ciag
˛ instrukcji r10 , . . . , rn0 , którego wykonanie dla
wszystkich stanów bazy danych daje ten sam efekt.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
20 / 42
Szeregowalność
Jeśli ciag
˛ instrukcji jest szeregowalny, to możemy traktować transakcje
jakby były wykonywane sekwencyjnie.
Osiagamy
˛
najwyższy możliwy poziom izolacji.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
21 / 42
Szeregowalność – przykład
Ciag
˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s),
write(2, X, s*3); read(1, Y, t); write(1,Y, t+10); read(2, Y, s);
write(2, Y, s*3); nie jest szeregowy ale jest szeregowalny.
Równoważny ciag
˛ to: read(1, X,t), write(1, X, t+10); read(1, Y, t);
write(1,Y, t+10); read(2, X, s), write(2, X, s*3); read(2, Y, s);
write(2, Y, s*3);
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
22 / 42
Szeregowalność – przykład
Ciag
˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s),
write(2, X, s*3); read(2, Y, s); write(2, Y, s*3); read(1, Y, t);
write(1,Y, t+10); nie jest szeregowalny.
Ciag
˛ instrukcji: read(1, X,t), write(1, X, t+10); read(2, X, s),
write(2, X, s + 30); read(2, Y, s); write(2, Y, s + 30); read(1, Y, t);
write(1,Y, t+10); jest szeregowalny tylko z powodu przmienności
dodawania.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
23 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
24 / 42
Blokady
W praktyce szeregowalność jest zbyt silnym wymogiem.
Szeregowanie transakcji mogłoby spowodować zbyt długi czas
działania poszczególnych transakcji.
Bardziej realistycznym rozwiazaniem
˛
sa˛ słabsze poziomy izolacji.
W celu ich zapewnienia można stosować mechanizmy takie jak
blokady wierszy lub (rzadziej) całych tabel.
Uwaga. W praktyce Oracle sam zarzadza
˛
blokadami jakie nakładaja˛
działania transakcji.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
25 / 42
Blokady dzielone
Blokada dzielona na rekord X pozwala innym transakcjom
odczytywać wartość rekordu X.
Blokady dzielone stosuje sie˛ w celu zabezpieczenia odczytanego
rekordu przed zmiana˛ w czasie działania transakcji, która go
odczytała.
Jeden rekord może mieć założonych wiele blokad dzielonych.
Transakcja odczytujac
˛ rekord X nakłada na niego blokade˛
dzielona.
˛
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
26 / 42
Blokady na wyłaczność
˛
Jeśli transakcja chce zmienić lub usunać
˛ rekord X musi nałożyć
na niego blokade˛ na wyłaczność.
˛
Blokady na wyłaczność
˛
nie można założyć na rekord, który ma
blokade˛ dzielona.
˛
Jeden rekord może mieć założona˛ tylko jedna˛ blokade˛ na
wyłaczność.
˛
Blokade˛ taka˛ zakładamy modyfikujac
˛ rekord. Przestaje być on
widoczny (przy poziomie commited read) aż do chwili
zatwierdzenie transakcji.
Zatwierdzenie transakcji zwalnia wszystkie nałozone przez nia˛
blokady.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
27 / 42
Zawieszenie wykonywania transakcji
Nałożona blokada może spowodować zawieszenie wykonywania
transakcji do czasu zatwierdzenia transakcji, która nałożyła
blokade.
˛
Dlatego trzeba unikać zakładania blokad (zwłaszcza na
wyłaczność)
˛
w sytuacji interakcji z użytkownikiem.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
28 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
29 / 42
Zakleszczenia
Rozważmy ciag
˛ interakcji:
T1
write(X,1)
T2
write(Y, 2)
write(Y,1)
write(X,2)
Obie transakcje czekaja˛ na zwolnienie blokady na wyłaczność.
˛
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
30 / 42
Zakleszczenia – Oracle
W przypadku wykrycia zakleszczenia SZBD Oracle wysyła do
jednej z transakcji komunikat o błedzie:
˛
„ORA–00060: deadlock
detected while waiting for resource”.
Transkacja, która otrzymała komunikat o błedzie kończy
oczekiwanie i może np. wykonać commit lub rollback.
Druga z transakcji oczekuje dalej na zwolnienie blokady.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
31 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
32 / 42
Długie transakcje
Jeśli czas modyfikacji trwa długo (np. modyfikacje programu lub
pliku tekstowego przez użytkownika) to cz˛esto nie warto zakładać
blokady.
Można zastosować np. system wypożyczania i zwracania.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
33 / 42
Inne rodzaje blokad
Blokady inkrementacyjne.
Blokady z aktualizacja.
˛
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
34 / 42
Outline
1
Transakcje
Problemy interakcji
2
Metody usuwania konfliktów
Szeregowalność
Blokady
Zakleszczenia
Misc
3
Transakcje i blokady w BD Oracle
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
35 / 42
O. traktuje każda˛ instrukcje˛ SQL jako atomowa˛ (statement level
atomicity).
Nie można aktualizować tylko cz˛eści tabeli.
Wycofanie instrukcji SQL skutkuje także wycofaniem skutków
działania wyzwalaczy, które uruchomiła.
Wycofanie instrukcji SQL nie powoduje wycofania całej transakcji.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
36 / 42
Każda sesja z baza˛ danych to jedna transakcja, zakończyć taka˛
transakcje˛ można przez polecienie commit lub rollback.
Innym sposobem na zakończenie transakcji (jako commit) jest
wydanie polecenia DDL lub zakończenie połaczenia
˛
z baza˛
danych (disconnect).
Każda nowa komenda SQL po commit lub instrukcji DDL
rozpoczyna nowa˛ transakcje.
˛
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
37 / 42
Polecenia specyficzne dla Oracle
SET TRANSACTION i SET TRANSACTION NAME <nazwa>,
COMMIT, ROLLBACK,
SAVEPOINT <nazwa>,
ROLLBACK TO SAVEPOINT.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
38 / 42
Rollback to savepoint
Polecenie rollback to savepoint <nazwa> wycofuje zmiany
wykonane przez transakcje˛ po założeniu punktu <nazwa>.
Wszystkie blokady założone po tym punkcie zostaja˛ zwolnione.
Jeśli inna transakcja czekała na zwolnienie blokady już wcześniej,
to nie otrzyma zasobu.
Nowe blokady bed
˛ a˛ mogły założyć tyko transakcje, które zażadaj
˛ a˛
go po jego zwolnieniu.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
39 / 42
Rollback to savepoint – przykład
Rozważmy nastepuj
˛ aca
˛ interakcje˛ trzech transakcji na tabeli r(a,b):
T1
T2
T3
...
...
...
savepoint powrot;
update r set a= 1
where b=5;
1 row updated.
update r set a= 2
where b=5;
rollback to s. powrot; T2 czeka ...
T2 czeka ...
update r set a= 3
where b=5;
...
1 row updated.
commit;
...
...
commit
1 row updated.
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
40 / 42
Poziomy izolacji w Oracle
Domyślnym poziomem izolacji jest read commited.
Inne poziomy to serializable oraz read only.
Poziom read only zapewnia powtarzalność wyników zapytań,
zabrania modyfikacji bazy danych (set transaction read only).
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
41 / 42
Poziomy izolacji w Oracle
set isolation level [committed read | serializable];
set transaction [read only | read write];
Konrad Zdanowski ( Uniwersytet Kardynała Stefana
Bazy danych
Wyszyńskiego,
– wykładWarszawa)
dziewiaty
˛ Transakcje
42 / 42