Transakcje

Transkrypt

Transakcje
Transakcje
Właściwości transakcji
• Transakcja – jednostka operowania na bazie
danych podlegająca kontroli i sterowaniu
• System zarządzania transakcjami ma za
zadanie takie sterowanie operacjami na bazie
danych, aby były one wykonywane z możliwie
wysokim współczynnikiem współbieżności i aby
przeciwdziałać naruszeniu spójności bazy
• Osiąga się to za pomocą odpowiednich
protokołów zarządzania transakcjami.
Transakcje i ich właściwości
• Transakcją T nazywamy ciąg następujących
operacji na wspólnej bazie danych:
–
–
–
–
rT[x] – czytanie (read) danej x przez transakcję T;
wT[x] – zapisanie (write) danej x przez transakcję T;
aT – odrzucenie (abort, rollback) transakcji T;
cT – zatwierdzenie (commit) transakcji T;
• x jest jednostką danych o różnym poziomie
granulacji np.. dana elementarna, krotka
(rekord), zbiór krotek wyznaczony przez
warunek Φ, tabela bazy danych, itd..
Definiowanie transakcji - przykład
CREATE PROCEDURE ZmniejszBGZ
@nrrach nchar(6),
@kwota int
AS
BEGIN
IF NOT EXISTS (SELECT * FROM BGZ
WHERE NrRach = @nrrach)
RETURN -1
ELSE
UPDATE BGZ SET Saldo = Saldo - @kwota
WHERE NrRach = @nrrach
RETURN @@error
END
CREATE TRIGGER UpBGZ
ON BGZ
FOR UPDATE
AS
BEGIN
DECLARE @Saldo int
SELECT @Saldo = BGZ.Saldo
FROM BGZ, deleted d
WHERE BGZ.NrRach = d.NrRach
IF @Saldo < 0
rollback
END
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
CREATE PROCEDURE ZwiekszWBK
@nrrach nchar(6),
@kwota int
AS
BEGIN
IF NOT EXISTS (SELECT * FROM WBK
WHERE NrRach = @nrrach)
RETURN -1
ELSE
UPDATE WBK SET Saldo = Saldo +
@kwota
WHERE NrRach = @nrrach
RETURN @@error
END
Definiowanie transakcji – przykład
BGZ
CREATE PROCEDURE Przelew_BGZ_WBK
@zrach nchar(5),
NrRach
Saldo
@narach nchar(5),
@kwota int
1111
1000
AS
BEGIN
DECLARE @stan int
BEGIN TRANSACTION
EXEC @stan = ZmniejszBGZ @zrach, @kwota
IF @stan = 0
EXEC @stan = ZwiekszWBK @narach, @ kwota
IF @stan = 0
BEGIN
commit
PRINT ('Transakcja powiodla sie')
return
END
rollback
PRINT ('Transakcja nie powiodla sie')
END
WBK
NrRach
Saldo
2222
1000
Definiowanie transakcji – przykład
CREATE PROCEDURE Przelew_BGZ_WBK
@zrach nchar(5),
@narach nchar(5),
@kwota int
AS
BEGIN
DECLARE @stan int
BEGIN TRANSACTION
EXEC @stan = ZmniejszBGZ @zrach, @kwota
IF @stan = 0
EXEC @stan = ZwiekszWBK @narach, @kwota
IF @stan = 0
BEGIN
commit
PRINT ('Transakcja powiodla sie')
return
END
rollback
PRINT ('Transakcja nie powiodla sie')
END
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
T: exec Przelew_BGZ_WBK '1111', '2222', 100
rT [‘1111’], wT [‘1111’], rT [‘2222’], wT [‘2222’], cT
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
900
2222
1100
Definiowanie transakcji – przykład
CREATE PROCEDURE Przelew_BGZ_WBK
@zrach nchar(5),
@narach nchar(5),
@kwota int
AS
BEGIN
DECLARE @stan int
BEGIN TRANSACTION
EXEC @stan = ZmniejszBGZ @zrach, @kwota
IF @stan = 0
EXEC @stan = ZwiekszWBK @narach, @kwota
IF @stan = 0
BEGIN
commit
PRINT ('Transakcja powiodla sie')
return
END
rollback
PRINT ('Transakcja nie powiodla sie')
END
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
T: exec Przelew_BGZ_WBK '1112', '2222', 100
rT [‘1112’], aT
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
Definiowanie transakcji – przykład
CREATE PROCEDURE Przelew_BGZ_WBK
@zrach nchar(5),
@narach nchar(5),
@kwota int
AS
BEGIN
DECLARE @stan int
BEGIN TRANSACTION
EXEC @stan = ZmniejszBGZ @zrach, @kwota
IF @stan = 0
EXEC @stan = ZwiekszWBK @narach, @kwota
IF @stan = 0
BEGIN
commit
PRINT ('Transakcja powiodla sie')
return
END
rollback
PRINT ('Transakcja nie powiodla sie')
END
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
T: exec Przelew_BGZ_WBK '1111', '2222', 1100
rT [‘1111’], wT [‘1111’], aT
Definiowanie transakcji – przykład
CREATE PROCEDURE Przelew_BGZ_WBK
@zrach nchar(5),
@narach nchar(5),
@kwota int
AS
BEGIN
DECLARE @stan int
BEGIN TRANSACTION
EXEC @stan = ZmniejszBGZ @zrach, @kwota
IF @stan = 0
EXEC @stan = ZwiekszWBK @narach, @kwota
IF @stan = 0
BEGIN
commit
PRINT ('Transakcja powiodla sie')
return
END
rollback
PRINT ('Transakcja nie powiodla sie')
END
BGZ
WBK
NrRach
Saldo
NrRach
Saldo
1111
1000
2222
1000
T: exec Przelew_BGZ_WBK '1111', '2223', 200
rT [‘1111’], wT [‘1111’], rT [‘2223’], aT
Definiowanie transakcji – podsumowanie
• Każde wykonanie procedury Przelew_BGZ_WBK
powoduje utworzenie nowej transakcji.
• Przykłady transakcji:
•
•
•
rT [‘1111’], wT [‘1111’], rT [‘2222’], wT [‘2222’], cT
rT [‘1112’], aT
rT [‘1111’], wT [‘2222’], aT
•
rT [‘1111’], wT [‘1111’], rT [‘2223’], aT
• W systemie, w którym istnieje wiele stanowisk
komputerowych może być tworzonych wiele transakcji
• Mogą się wykonywać współbieżnie, a więc przed
zakończeniem jednej może się uruchamiać inna.
Właściwości ACID
• Przyjmuje się, że transakcje i protokoły zarządzania transakcjami
powinny posiadać właściwości ACID:
• Atomowość (atomicity) – każda transakcja stanowi pojedynczą i
niepodzielną jednostkę przetwarzania. Każda transakcja jest
wykonywana w całości albo wcale.
• Spójność (consistency) – transakcja rozpoczynając się w spójnym
stanie bazy danych pozostawia bazę danych w stanie spójnym. Nie
może naruszyć warunków spójności.
• Odizolowanie (isolation) – zmiany wykonywane przez transakcję nie
zatwierdzoną nie są widziane przez inne transakcje (chyba, że
przyjęty poziom izolacji na to zezwala).
• Trwałość (duration) – zmiany w bazie danych dokonane przez
transakcję zatwierdzoną są trwałe w bazie danych, tzn. nawet w
przypadku awarii systemu musi istnieć możliwość ich odtworzenia.
Właściwości ACID - przykład
• Atomowość oznacza, że transakcję:
rT [‘1111’], wT [‘1111’], rT [‘2222’], wT [‘2222’], cT
traktujemy jako niepodzielną całość. Nie
może być sytuacji, że system wykona tylko
dwie operacje, a dwóch nie.
Właściwości ACID - przykład
• Spójność oznacza, że system nie dopuści do
zatwierdzenia transakcji, która naruszy
jakikolwiek warunek spójności bazy danych
• Przykładowo: stan rachunku bankowego musi
być większy od zera (statyczny warunek
spójności) lub suma stanów kont po wykonaniu
transakcji musi być taka sama jak suma przed
wykonaniem transakcji
Właściwości ACID - przykład
• Odizolowanie oznacza, że zmiany wykonane przez
jedną transakcję nie są widoczne w innych transakcjach
dopóty, dopóki transakcja ta nie zostanie zatwierdzona.
• Rozważmy następujący ciąg operacji:
r1[Konto1], w1[Konto1], r1[Konto2], r2[Konto2], c2, w1[Konto2], c1
Transakcja T2 odczytuje wartość Konto2 zanim
transakcja T1 została zatwierdzona. Naruszony jest
warunek odizolowania.
• Często jednak sytuacja taka jest dopuszczalna.
Właściwości ACID - przykład
• Trwałość oznacza, że zmiany
wprowadzone do bazy danych przez
zatwierdzoną transakcję są w tej bazie
trwałe.
• W przypadku awarii systemu musi istnieć
mechanizm ich odtwarzania.
Nieodtwarzalne historie przetwarzania - scenariusz
•
•
•
•
•
•
•
•
•
Przypuśćmy, że transakcja T1 zmieniła wartość danej x
H: w1[x]
Następnie transakcja T2 wczytała x i na podstawie jej wartości zmieniła
wartość danej y na bazie danych (T2 czyta z T1)
H: w1[x] r2[x] w2[x->y]
Następnie transakcja T2 została zatwierdzona, a po tym zdarzeniu powstała
konieczność odrzucenia T1.
H: w1[x] r2[x] w2[x->y] c2 w1[z] a1
Należy więc wycofać wszystkie zmiany, jakie wprowadziła w bazie danych
transakcja T1, a także wszystkie konsekwencje tych zmian, a więc zmianę
wartości danej y.
Ta ostatnia operacja nie jest jednak możliwa, gdyż T2 została zatwierdzona.
Jest to przykład historii nieodwracalnej.
Nieodtwarzalne historie przetwarzania –
przyczyna i unikanie
• Rozważmy nieodwracalną historię przetwarzania:
H: w1[x] r2[x] w2[x->y] c2 w1[z] a1
• Powodem anomalii braku odtwarzalności jest to, że
transakcja T2 czytająca dane z nie zatwierdzonej
transakcji (T1) została zatwierdzona w czasie działania
transakcji T1.
• Aby sytuacji takiej uniknąć należałoby czekać z
rozpoczęciem transakcji T2 do czasu, aż zostanie
zatwierdzona T1.
• Anomalię tę nazywa się brudnym czytaniem (ang. dirty
read).
Historie przetwarzania z anomalią powtórnego
czytania - scenariusz
•
•
•
•
•
•
•
•
•
•
Przypuśćmy, że transakcja T1 czyta wartość danej x
H: r1[x]
Następnie transakcja T2 zapisuje nową wartość x i jest zatwierdzana
H: r1[x] w2[x] c2
Jeśli teraz transakcja T1 ponownie czyta daną x, to może się okazać, że
dana ta ma inną wartość.
H: r1[x] w2[x] c2 r1[x] c1
Transakcja T dysponuje więc dwiema różnymi wartościami tej samej danej.
Może się zdarzyć, że T2 usunie daną x.
Wówczas przy próbie ponownego odczytania transakcja T1 na informację,
że danej x nie ma w bazie.
Jest to anomalia powtórnego czytania.
Historie przetwarzania z anomalią
powtórnego czytania– przyczyna i unikanie
• Rozważmy historię przetwarzania z anomalią powtórnego czytania:
H: r1[x] w2[x] c2 r1[x] c1
• Powodem występowania anomalii powtórnego czytania jest to, że
dopuszczalne jest zapisywanie w nie zatwierdzonych transakcjach.
• Anomalię tę można wyeliminować zakładając, że zapisywanie
danych wczytanych przez transakcję jest dopuszczalne dopiero
wtedy, gdy transakcja ta została zatwierdzona.
• Żadna transakcja więc nie może zapisywać w transakcjach nie
zatwierdzonych.
Historie przetwarzania z fantomami - scenariusz
•
•
•
•
•
•
•
•
Przypuśćmy, że transakcja T1 wczytała z tabeli R zbiór rekordów
spełniających warunek Φ
H: r1[u]
Następnie transakcja T2 dołączyła do R nowy rekord spełniający warunek
Φ i została zatwierdzana
H: r1[u] w2[z] c2
Jeśli teraz transakcja T1 ponownie odwoła się do rekordów tabeli R
spełniających warunek Φ, to może się okazać, że zbiór jest inny.
H: r1[u] w2[z] c2 r1[u] c1
Transakcja T dysponuje więc dwiema różnymi zestawami danych
spełniających warunek Φ.
Nowy rekord pojawiający się w obszarze zainteresować transakcji T1
nazywa się fantomem.
Historie przetwarzania z fantomami –
przyczyna i unikanie
• Rozważmy historię przetwarzania z fantomami:
H: r1[u] w2[z] c2 r1[u] c1
• Powodem pojawienia się fantomów jest to, że dopuszczalna jest
zmiana zbioru danych, na którym operuje transakcja T1.
• Pojawianiu się fantomów można zapobiec zakładając, że zmiany
wykonywane przez transakcję (dołączanie, usuwanie, aktualizacja)
są takie, że nie powodują zmiany zbioru danych, na których operuje
T1.
• Należy więc uwzględnić formuły definiujące zbiory danych, na
których działają transakcje.
Historie przetwarzania - podsumowanie
• Rozważając historie przetwarzania transakcji
zdefiniowaliśmy cztery ich klasy, związane z nimi
anomalie i sposoby ich unikania.
• W dalszym ciągu pokażemy, w jaki sposób można
sterować poziomami izolacji transakcji.
• Pokażemy jaki jest związek pomiędzy wybranym
poziomem izolacji, a właściwą mu klasą przetwarzania i
tym samym, z jakimi anomaliami należy się liczyć.
• Do określenia poziomów izolacji konieczne jest
sprecyzowanie pojęcia konfliktowości między operacjami
tworzącymi historię przetwarzania transakcji.
Konfliktowość operacji
• Z góry można określić, jakie operacje nie są
konfliktowe.
• Operacje oi[x] i pj[y] nie są konfliktowe, jeśli
zachodzi co najmniej jeden z poniższych
warunków:
– i = j, tj. pochodzą z tej samej transakcji,
– x <> y, tj. dotyczą różnych danych (lub rozłącznych zbiorów
danych),
– żadna z operacji nie jest operacją zapisu,
– co najmniej jedna z operacji pochodzi od transakcji, która w
chwili wywołania drugiej została już zakończona
Konfliktowość operacji
• Operacje oi[x] i pj[y] mogą być konfliktowe, wtedy
gdy:
– i <> j, tj. operacje pochodzą z różnych transakcji,
– x = y, tj. operacje dotyczą tej samej danej (lub przecinających się
zbiorów danych),
– Co najmniej jedna z operacji jest operacją zapisu,
– Obydwie transakcje, z których pochodzą rozważane operacje są
aktywne,
– Druga operacja pj[y] powoduje zmianę zbioru danych zbioru
danych x, na których działa pierwsza operacja oi[x].
Przetwarzanie operacji na różnych
poziomach izolacji
• Wyróżniamy cztery poziomy izolacji transakcji:
najniższy(0) – zapewnia największą współbieżność, ale
wiąże się z największym ryzykiem występowania
anomalii; najwyższy(3) – pozwala uniknąć wszelkich
anomalii, ale jest najbardziej kosztowny (często
niepotrzebnie)
• Przyjęcie określonego poziomu izolacji wiąże się z
określonymi problemami:
– Zbyt niski: duża współbieżność – większe ryzyko anomalii
– Zbyt wysoki: nieuzasadnione opóźnienie transakcji
Poziomy izolacji - przykład
• Zakładamy istnienie tabeli Procesor o
następującej postaci:
Procesor
Nazwa Cena
Stan
200MMX
320
20
233MMX
370
50
Na tabeli będą działały dwie transakcje.
Poziom izolacji 0
(READ UNCOMMITED)
• Poziom izolacji 0 dopuszcza czytanie przez transakcje
danych nie zatwierdzonych, tj. danych które zostały
zmienione przez transakcję jeszcze nie zatwierdzoną.
• Za operacje konfliktowe uznaje się tylko operacje zapisu,
a dwie operacje, z których jedna jest operacją odczytu
nie są konfliktowe.
• Ten poziom izolacji nazywa się READ UNCOMMITED, a
popularnie dirty read (brudne czytanie).
• Ten rodzaj współbieżności prowadzi do braku
odtwarzalności, anomalii powtórnego czytania oraz do
pojawienia się fantomów.
• Zaletą jest wysoki poziom współbieżności.
Poziom izolacji READ UNCOMMITED przykład
Transakcja T1
Transakcja T2
SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED
go
SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED
GO
begin transaction
begin transaction
update Procesor set Cena = 300
where Nazwa = '200MMX'
select * from Procesor
where Nazwa = '200MMX'
rollback
T2 ma niepoprawną informację o cenie (300
zamiast 320)
Poziom izolacji 1
(READ COMMITED)
• Poziom wprowadza zakaz czytania danych z nie
zatwierdzonych transakcji, a więc czytać można tylko
dane zatwierdzone.
• Ten poziom izolacji nazywa się READ COMMITED
• Przy tym poziomie izolacji dopuszczalne jest jednak zapisywanie
danych w transakcjach nie zatwierdzonych.
• Domyślny poziom SQL Server
• Za konfliktowe uznaje się takie pary, gdzie pierwsza jest operacją
zapisu a druga odczytu, lub obydwie są operacjami zapisu.
• Nie są konfliktowe operacje, z których pierwsza jest operacją
czytania, a druga operacją zapisu.
• Przyjęcie tego poziomu eliminuje brak odtwarzalności.
• Na tym poziomie występują zarówno anomalia powtórnego czytania,
jak również fantomów.
Poziom izolacji READ COMMITED przykład
Transakcja T1
Transakcja T2
SET TRANSACTION ISOLATION LEVEL READ
COMMITTED
go
SET TRANSACTION ISOLATION LEVEL READ
COMMITTED
GO
begin transaction
begin transaction
select sum(Cena*Stan) from Procesor
where Nazwa = '200MMX'
update Procesor set Cena = 310
where Nazwa = '200MMX'
select sum(Cena*Stan)
from Procesor
where Nazwa = '200MMX'
Wynik różny dla pierwszego i drugiego SELECT
commit
Poziom izolacji 2
(REPEATABLE READ)
• Poziom wprowadza zakaz zapisywania w transakcjach nie
zatwierdzonych. Jeśli więc transakcja nie zatwierdzona przeczytała
jakąś daną, to dana ta może być tylko czytana przez inną
transakcję.
• Jeśli transakcja nie zatwierdzona zapisała jakąś daną, to nie można
jej ani odczytać ani tym bardziej zapisać, dopóki transakcja nie
zostanie zatwierdzona.
• Za konfliktowe uważa się takie pary operacji, gdzie co najmniej
jedna jest operacją zapisu. Za niekonfliktowe tylko operacje
czytania.
• Ten poziom izolacji nazywa się REPEATABLE READ.
• Przyjęcie tego poziomu eliminuje brak odtwarzalności oraz anomalię
powtórnego czytania.
• Na tym poziomie mogą pojawić się fantomy.
Poziom izolacji REPEATABLE READ przykład
Transakcja T1
Transakcja T2
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
go
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
GO
begin transaction
begin transaction
select sum(Cena*Stan) from Procesor
where Nazwa = '200MMX'
update Procesor set Cena = 310
where Nazwa = '200MMX'
select sum(Cena*Stan)
from Procesor
where Nazwa = '200MMX'
Wynik taki sam dla pierwszego i drugiego
SELECT
commit
Poziom izolacji REPEATABLE READ przykład
Transakcja T1
Transakcja T2
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
go
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
GO
begin transaction
begin transaction
select sum(Cena*Stan) from Procesor
where Nazwa = '200MMX'
insert into Procesor
values('200MMX', 250, 10)
select sum(Cena*Stan)
from Procesor
where Nazwa = '200MMX'
Wynik różny dla pierwszego i drugiego SELECT
commit
Poziom izolacji 3
(SERIALIZABLE)
• Poziom izolacji rozwiązuje problem fantomów.
• Za niekonfliktowe uznaje się tylko te operacje, gdy
działanie jednej z nich nie powoduje zmiany zbioru
danych, na których działa druga.
• SERIALIZABLE oznacza, że historia przetwarzania
transakcji jest szeregowalna, a więc wszystkie operacje
jednej transakcji. poprzedzają wszystkie operacje innej
transakcji.
• Przyjęcie tego poziomu eliminuje wszystkie anomalie, w
tym problem fantomów.
• Współbieżność transakcji jest najmniejsza, a więc
efektywność przetwarzania jest bardzo niska. Należy
stosować wtedy, gdy to jest konieczne.
Poziom izolacji SERIALIZABLE - przykład
Transakcja T1
Transakcja T2
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE
go
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE
GO
begin transaction
begin transaction
select sum(Cena*Stan) from Procesor
where Nazwa = '200MMX'
insert into Procesor
values('200MMX', 250, 10)
select sum(Cena*Stan)
from Procesor
where Nazwa = '200MMX'
Wynik taki sam dla pierwszego i drugiego
SELECT. Wynik nie uwzględnia INSERT
Wykonanie insert przez T2
Poziomy izolacji transakcji podsumowanie
Poziom
izolacji
Brak
odtwarzal
ności
T
Anomalia
Fantomy
powtórnego
czytania
T
T
1: READ
COMMITED
N
T
T
2: REPEATABLE
READ
N
N
T
3: SERIALIZABLE
N
N
N
O: READ
UNCOMMITED
Dziękuję za uwagę

Podobne dokumenty