Wykład 6 - Pierwsza
Transkrypt
Wykład 6 - Pierwsza
Bazy danych 2
Wykład 6
Transakcje
Transakcje
Def. Transakcjami nazywamy logiczne jednostki pracy które
wprowadzają zmiany do bazy danych lub które wyszukują dane
O transakcjach mówimy w kontekście:
aktualizacji bazy danych
współuŜytkowania danych przez wielu uŜytkowników i powstawania
wzajemnych konfliktów
Transakcja moŜe obejmować jedną instrukcję lub większą ilość
instrukcji.
Właściwości transakcji
Niepodzielność
ść – albo wszystkie instrukcje wchodzące w skład transakcji są
wykonane albo Ŝadna
Spójność
ść – wszystkie transakcje muszą zachować spójność i integralność bazy
danych
Izolacja – jeśli transakcja modyfikuje dane, to te dane mogą być czasowo
niespójne, dlatego muszą być niedostępne dla innych transakcji dopóty, dopóki
transakcja nie skończy ich uŜywać
Trwałłość
ść – gdy transakcja się kończy, to wszystkie zmiany przez nią dokonane
muszą zostać w pełni utrwalone
Transakcja – sekwencja logiczna
Logiczna sekwencja jest nastę
ępują
ąca
[BEGIN [WORK]/
START TRANSACTION
[nazwa_transakcji]
Wykonaj polecenie 1
ROLLBACK [WORK] [TRANSACTION]
(baza danych powraca do stanu
pierwotnego)
[BEGIN [WORK]/
START TRANSACTION
[nazwa_transakcji]
Wykonaj polecenie 1
SAVEPOINT nazwa
Wykonaj polecenie 2
Wykonaj polecenie 3
ROLLBACK TO SAVEPOINT nazwa
Wykonaj polecenie 4
COMMIT [WORK] [TRANSACTION]
(zmiany zostają zapisane w bazie)
Transakcja z punktami zapisu
Przykład
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT TRANSACTION;
UWAGI
Standard SQL nie definiuje frazy BEGIN. Transakcje w tym standardzie
rozpoczynają się bowiem automatycznie wraz z wykonaniem pierwszej
instrukcji.
W programistycznym SQL zakończenie programu kończy z
powodzeniem takŜe ostatnią transakcję, nawet jeŜeli nie zostało
wydane polecenie COMMIT, zaś zakończenie z błędem powoduje
wycofanie aktualnej transakcji.
Problem utraty zmian
Przyczyna zaburzeń: Transakcja T1 czyta dane podczas, gdy są one
modyfikowane przez transakcję T2
Problem niezatwierdzonych
zaleŜ
Ŝnoś
ści (brudny odczyt)
Przyczyna zaburzeń: Transakcja T3 jest wykonywana przy załoŜeniu,
Ŝe modyfikacja wykonana przez przez transakcję T4 została
zakończona z powodzeniem
Problem analizy niespójnoś
ści
Przyczyna zaburzeń: Transakcja T6 czyta dane, które są modyfikowane
przez transakcję T5
Kontrola współłbieŜ
Ŝnoś
ści
Uwaga: DBMS powinien zapewniać pewien „mechanizm” umoŜliwiający
zarządzanie operacjami wykonywanymi jednocześnie na bazie danych bez
dopuszczania do niepoŜądanych oddziaływań pomiędzy nimi.
Jednym z nasuwających się rozwiązań jest zezwolenie na wykonywanie
tylko jednej transakcji w danym czasie; takie postępowanie jednak w
znacznym stopniu wpływa na wydajność bazy danych.
Rozwiązaniem lepszym (w kontekście wydajności) jest jakaś forma
„przeplatania” transakcji, wiąŜe się z tym pojęcie szeregowalności
[Papadimitriou, 1979]
Pojęcie szeregowalności
Def. Harmonogram jest to ciąg operacji wykonywanych jednocześnie
transakcji, w których zachowany jest porządek operacji kaŜdej transakcji.
Def. Harmonogram sekwencyjny to harmonogram, w którym operacje
kaŜdej transakcji są wykonywane kolejno, bez przeplatania operacji z
róŜnych transakcji.
W przypadku harmonogramu sekwencyjnego transakcje nie
oddziaływają na siebie, poniewaŜ w danym czasie jest wykonywana
tylko jedna transakcja.
Kolejność transakcji nie jest ustalona, zatem wynik kaŜdego
sekwencyjnego wykonania transakcji nie musi być taki sam.
Def. Harmonogram niesekwencyjny jest to harmonogram, w którym
operacje ze zbioru jednocześnie wykonywanych transakcji, są
przeplecione.
Pojęcie szeregowalności
Def. Harmonogram wykonywanych jednocześnie transakcji nazywamy
szeregowalnym jeśli doprowadza on do takiego samego stanu bazy
danych jak pewne wykonanie sekwencyjne tych transakcji.
Fakt: Harmonogram szeregowalny jest harmonogramem poprawnym,
czyli zapewnia takie wykonanie transakcji współbieŜnie nie dopuszczając
do niepoŜądanych oddziaływań pomiędzy nimi.
Uzasadnienie:
Indywidualne transakcje są poprawne
Dowolny harmonogram sekwencyjny jest poprawny
Zatem harmonogram szeregowalny jest poprawny, bo doprowadza
bazę do stanu takiego jak harmonogram szeregowalny.
Pojęcie szeregowalności
Dla zapewnienia szeregowalności waŜne jest wzajemne uporządkowanie
operacji odczytu i zapisu transakcji:
JeŜeli dwie transakcje jedynie czytają ten sam element danych, to ich
wzajemna kolejność nie jest istotna
JeŜeli dwie transakcje czytają lub zapisują róŜne elementy danych, to
nie kolidują ze sobą i ich wzajemna kolejność nie jest istotna.
JeŜeli jedna transakcja zapisuje element danych, a druga go
odczytuje lub zapisuje, to kolejność wykonania tych transakcji ma
znaczenie.
Pojęcie szeregowalności
Techniki kontroli wielodostępu
Metoda blokad (często stosowana przez
byłego juz posła Andrzeja.L)
Metody oparte na blokadach
•
Metoda oparta na blokadach polega na tym, Ŝe transakcja, która
odwołuje się do danych blokuje innym transakcjom dostęp do danych.
•
RozróŜniamy dwa typy blokad:
–
Blokada do odczytu R (read locks) – jeŜeli transakcji zostanie
przyznana blokada read locks jednostki danych, to transakcja moŜe
odczytywać wartość tej jednostki, ale nie moŜe jej zmieniać
–
Blokada do zapisu W (write locks) - jeŜeli transakcji zostanie
przyznana blokada write locks jednostki danych, to transakcja moŜe
zarówno odczytywać wartość tej jednostki, jak i ją zmieniać
–
Sposób przyznawania działania blokad przedstawia macierz:
W R
W N
N
R
Y
N
Protokól dostępu danych
1.
Transakcja, która wymaga dostępu do jednostki danych występuje o
przyznanie blokady dzielonej (jeŜeli zamierza jedynie odczytać wartość
jednostki) lub blokady wyłącznej (jeŜeli zamierza odczytać i
modyfikować wartość jednostki)
2.
JeŜeli jednostka nie została wcześniej zablokowana przez inną
transakcję , to blokada jest przydzielana transakcji, która o nią
występuje.
3.
JeŜeli prośba o blokadę jednostki została odrzucona, poniewaŜ jest w
konflikcie z blokadą juŜ załoŜoną, to transakcja przechodzi w stan
oczekiwania, aŜ blokada zostanie zwolniona.
4.
Transakcja utrzymuje blokadę jednostki, aŜ do momentu jej jawnego
odwołania w trakcie wykonania lub do czasu zakończenia (poprzez
odrzucenie lub wypełnienie).
Protokół dostępu danych - przykład
balx=100 baly=400
T9 ->T10
balx=220 baly=330
T10 ->T9
balx=210 baly=340
Stosujemy blokowanie
balx=220 baly=340
schemat nie jest szeregowalny
Protokól blokowania dwufazowego– 2PL
Schemat protokołu blokowania dwufazowego jest następujący:
1.
Zanim transakcje rozpocznie przetwarzanie jednostki musi uzyskać
blokadę tej jednostki; transakcja Ŝąda załoŜenia wszystkich
potrzebnych blokad
2.
Po zwolnieniu blokady transakcja nie moŜe juŜ nakładać nowych
blokad.
Twierdzenie (Eswaran i in., 1976)
•
JeŜeli wszystkie transakcje spełniają protokół dwufazowego
blokowania, to wszystkie harmonogramy niesekwencyjne są
szeregowalne.
2PL – zapobieganie utracie zmian
2PL – zapobieganie brudnemu odczytowi
2PL – zapobieganie wystąpieniu
problemu analizy niespójności
2PL – wydaje się wspaniale
ale ...
2PL – problem (wycofanie kaskadowe)
Sztywny 2PL – blokady zdejmowane w momencie zakończenia transakcji
Ścisłły 2PL- blokady wyłączne ( do zapisu) zdejmowane w momencie
zakończenia transakcji
2PL – problem (zakleszczenie)
Metoda wykluczeń
ń – transakcja, która wystąpiła o blokadę czeka na nią tylko określony czas
Metoda zapobiegania zakleszczeniom – system nie dopuszcza do blokady
Metoda wykrywania zakleszczeń
ń o odtwarzania – system wykrywa zakleszczenie i
odrzuca jedną z transakcji, a później ją wznawia
WspółbieŜność w SQL – poziomy izolacji
Standard SQL nie zawiera Ŝadnych jawnych moŜliwości blokowania,
umoŜliwia stosowanie róŜnych poziomów izolacji transakcji od innych
transakcji, poziomy izolacji definiowane są na podstawie tego, które z
naruszeń szeregowalności dopuszczają.
WspółbieŜność w SQL – poziomy
izolacji
Brudny odczyt (Dirty read): pierwsza transakcja modyfikuje wiersz, a
druga go czyta, zanim zmiana została zatwierdzona przez instrukcję
COMMIT. Jeśli pierwsza transakcja została anulowana, zmiana nie
miała miejsca i druga transakcja przeczytała wiersz, który naprawdę
nigdy nie istniał
Niepowtarzalny odczyt (Non-repeatable read): pierwsza transakcja
czyta wiersz. Druga go usuwa lub modyfikuje i wykonuje COMMIT
przed pierwszą. Teraz pierwsza transakcja mogłaby przeczytać ten
sam wiersz jeszcze raz i otrzymać inne wyniki zanim zostanie sama
zatwierdzona.
Odczyt widmo (Phantom): pierwsza transakcja odczytuje wiersze
spełniające predykat. Druga wstawia wartości (instrukcja INSERT) lub
je modyfikuje (UPDATE) tak, Ŝe one równieŜ spełniają predykat.
Następne wykonanie tego samego zapytania przez pierwszą
transakcję da inne wyniki.
WspółbieŜność w SQL – poziomy izolacji
Poziomy
izolacji
Charakterystyka
READ
UNCOMMITED
READ
COMMITED
niedozwolone czytanie wierszy z blokadą write lock
blokada read lock załoŜona i utrzymywana tylko na czas
czytania wiersza
niedozwolone czytanie wierszy z blokadą write lock
Blokada read lock załoŜona na wszystkie wiersze będące
wynikiem zapytania i utrzymywana do końca transakcji
niedozwolone czytanie wierszy z blokadą write lock
blokada read lock załoŜona na wszystkie wiersze zawierające
informacje na zadany temat (nie tylko te spełniajace warunek
selekcji)
REPEATABLE
READ
SERIALIZABLE
dozwolone czytanie wierszy z załoŜoną blokadą write lock
brak blokady read lock
WspółbieŜność w SQL – poziomy izolacji
Poziom izolacji
Brudny
odczyt
Niepowtarzalny
odczyt
Odczyt
widmo
READ
UNCOMMITED
TAK
TAK
TAK
READ COMMITED
NIE
TAK
TAK
REPEATABLE READ NIE
NIE
TAK
SERIALIZABLE
NIE
NIE
NIE
Definiowanie poziomu izolacji w SQL
SET TRANSACTION ISOLATION LEVEL
{READ UNCOMMITED | READ COMMITED | REPEATABLE READ |
SERIALIZABLE}
Im wyŜszy poziom izolacji tym większe bezpieczeństwo, ale wolniejsze
działanie BDMS
JeŜeli wszystkie transakcje są na poziomie SERIALIZABLE, to system
gwarantuje szeregowalność harmonogramów.
Jawne blokady (zaleŜne od dialektu)
Wiersze i tabele moŜna blokować wyłącznie wewnątrz
transakcji, po zakończeniu transakcji wszystkie blokady
zostaną zwolnione, nie ma sposobu jawnego zwolnienia
blokady
Blokowanie wierszy spełniających warunek
SELECT ….. FOR UPDATE
Blokowanie tabel
LOCK TABLE table-name
IN { SHARE | EXCLUSIVE } MODE
Dziękuję za uwagę!