Obiektowe modelowanie systemów informatycznych



Pobieranie 8,01 Mb.
Strona96/113
Data23.10.2017
Rozmiar8,01 Mb.
1   ...   92   93   94   95   96   97   98   99   ...   113

Zarządzanie transakcjami w języku SQL


Transakcji mają właściwość ASOT. Transakcja rozpoczyna się w chwili wydania polecenia inicjującego transakcję (begin transaction...). Charakterystyki transakcji określa się za pomocą komend SET TRANSACTION i SET CONSTRAINTS o składni:

SET TRANSACTION lista-opcji


opcje:

tryb dostępu: READ ONLY, READ WRITE

rozmiar obszaru diagnostyk: DIAGNOSTICS SIZE n

Poziom izolacji: ISOLATION LEVEL izolacja



izolacja: SERIALIZABLE (domyślna)

REPEATABLE READ,

READ COMMITED,

READ UNCOMMITED.

SET CONSTRAINTS { lista-warunków/ ALL}

{ DEFERRED / IMMEDIATE }

SET CONSTRAINTS ustała tryb sprawdzania warunków spójności na natychmiastowy (IMMEDIATE) lub opóźniony (DEFERRED).

Przyjęcie określonego poziomu izolacji może być źródłem problemów omówionych wcześniej. W tablice 7 jest pokazany związek poziomów izolacji z problemami przetwarzania transakcji.

Tablica 7.


Poziom izolacji

Brak odtwarzalności

Anomalia powtórnego czytania

Fantomy

0: READ UNCOMMITED

T

T

T

1: READ COMMITED

N

T

T

2: REPEATABLE READ

N

N

T

3: SERIALIZABLE

N

N

N

Przykłady przetwarzania bazy danych na różnych poziomach izolacji.

Przypuśćmy, że w bazie danych istnieje tabela Towar o postaci przedstawionej w tablicy 8.

Tablica 8. Przykładowa tabela bazy danych „Towar”.



Nazwa

Cena

Stan

200MMX

320

20

233MMX

370

50


Poziom izolacji 0. Przy poziomie izolacji 0 możliwe jest czytanie danych zmienionych przez transakcje jeszcze nie zatwierdzone. Mówi się wówczas o „brudnym czytaniu”. Dopuszczenie takiego czytania bardzo zwiększa współbieżność przetwarzania, ale jednocześnie może doprowadzić do udostępniania nieprawdziwych danych z bazy danych, co ilustruje przykład w tablicy 9.

Tablica 9. Historia przetwarzania transakcji na poziomie izolacji 0 zapis-odczyt



Transakcja T1

Transakcja T2

set transaction isolation level 0

set transaction isolation level 0

begin transaction

update Towar set Cena = 300

Where Nazwa = ‘200MMX’

T1 zmienia cenę








begin transaction

select Cena from Towar

where nazwa = ‘200MMX’

T2 czyta zmienioną cenę


Rollback

T1 wycofuje zmianę







T2 posiada niepoprawną informację o cenie


Zerowy poziom izolacji może być stosowany tylko w takich transakcjach, o których wiemy, że nawet w przypadku błędnych danych nie spowodują poważnych negatywnych konsekwencji. Można go stosować na przykład dla transakcji, których zadaniem jest tylko udzielanie informacji z bazy danych.

Poziom izolacji 1.

Cechą charakterystyczną tego poziomu izolacji jest to, że możliwe jest aktualizowanie przez transakcję T2 danych wczytanych przez nie zakończoną jeszcze transakcję T1. Po powtórnym odwołaniu się do tych samych danych transakcji T1 można uzyskać sprzeczne informacje.


Tablica 10. Historia przetwarzania transakcji na poziomie izolacji 1: odczyt-zapis

Transakcja T1

Transakcja T2

set transaction isolation level 1

set transaction isolation level 1

begin transaction

select Cena, Stan from Towar

where Nazwa = ‘200MMX’

T1 czyta cenę i stan towaru








begin transaction

update Towar set Cena = 310

where Nazwa = ‘200MMX’

T2 zmienia cenę wczytaną przez T1



select sum(Cena*Stan) from Towar

where Nazwa = ‘200MMX’


T1 czeka na zakończenie T2







Commit

Wykonanie oczekującej operacji ‘select’ dla T1. Wynik jest sprzeczny z poprzednią operacją ‘select’





Poziom izolacji 2.

W poziomie izolacji 2 mamy zagwarantowanie, że przy ponownym odwołaniu się do tych samych danych dostajemy identyczne informacje.

Tablica 11. Historia przetwarzania transakcji na poziomie izolacji 2: odczyt-zapis-odczyt


Transakcja T1

Transakcja T2

set transaction isolation level 2

set transaction isolation level 2

begin transaction

select Cena, Stan from Towar

where Nazwa = ‘200MMX’

T1 czyta cenę i stan towaru








begin transaction

update Towar set Cena = 310

where Nazwa = ‘200MMX’

T2 czeka na zakończenie T1


select sum (Cena*Stan) from Towar

where Nazwa = ‘200MMX’


T1 oblicza wartość towaru





Commit







Wykonanie oczekującej operacji ‘update’ dla T2.

Poziom izolacji 2 zabezpiecza przed modyfikacją wczytanych danych, ale nie przed dołączeniem nowych wierszy. Sytuację te ilustruje historia przetwarzania podana w tablicy 12.

Tablica 12. Historia przetwarzania na poziomie izolacji 2: odczyt-dołączenie-odczyt


Transakcja T1

Transakcja T2

set transaction isolation level 2

set transaction isolation level 2

begin transaction

select Cena, Stan from Towar

where Nazwa = ‘200MMX’

T1 czyta cenę i stan towaru








begin transaction

insert into Towar

values (‘200MMX’, 250,10)

T2 dołącza nowy wiersz „fantom”





Commit

Select sum (Cena*Stan) from Towar

where Nazwa =’200MMX’



T1 oblicza wartość towaru. Wynik jest sprzeczny z poprzednią operacją select





Poziom izolacji 3.

Przed pojawieniem się fantomów chroni poziom izolacji 3. Przy tym poziomie izolacji przetwarzanie z tablicy 12 miałoby historię podaną w tablicy 13.



Tablica 13. Historia przetwarzania transakcji na poziomie izolacji 3: odczyt-dołączenie-odczyt

Transakcja T1

Transakcja T2

set transaction isolation level 3

set transaction isolation level 3

begin transaction

select Cena, Stan from Towar

where Nazwa = ‘200MMX’

T1 czyta cenę i stan towaru








begin transaction

insert into Towar

values (‘200MMX’, 250, 10)

T2 czeka na zakończenie T1


Select sum (Cena*Stan) from Towar

where Nazwa =’200MMX’



T1 oblicza wartość towaru.




Commit







Wykonanie „insert” przez T2


1   ...   92   93   94   95   96   97   98   99   ...   113


©operacji.org 2017
wyślij wiadomość

    Strona główna