Język SQL – transakcje, perspektywy, indeksy

Transkrypt

Język SQL – transakcje, perspektywy, indeksy
BAZY DANYCH – wykład 6
Język SQL –
transakcje, perspektywy, indeksy
Dr hab. Sławomir Zadrożny, prof. PR
Do czego służą transakcje ?
Systemy zarządzania bazą danych (DBMS)
zazwyczaj zezwalają na jednoczesny dostęp
do danych wielu użytkowników.
Zapytania i modyfikacje.
DBMS musi zapobiec niepożądanym
interakcjom pomiędzy działaniami
użytkowników i zapewnić poprawne działanie
również w sytuacjach awaryjnych
Bazy danych – wykład 6
2
Przykład: niepożądanej interakcji
Dwie osoby jednocześnie podejmują 100 PLN
z tego samego konta (za pośrednictwem
dwóch bankomatów) – należy zapewnić
odpowiedni stan konta po tych operacjach
(zmniejszony o 200 PLN, a nie np. o 100 PLN)
Inny przykład: system realizuje przelew z
jednego konta na drugie i po zmniejszeniu
stanu pierwszego występuje awaria –
pieniądze nie mogą „zaginąć” !
Bazy danych – wykład 6
3
Transakcje
Transakcja = sekwencja operacji na
bazie danych (lub proces ją realizujący)
Zazwyczaj z jawnie określonymi
regułami interakcji z innymi
transakcjami
W języku SQL transakcje mogą być
wyróżniane domyślnie lub za pomocą
jawnie użytych instrukcji sterujących
Bazy danych – wykład 6
4
ACID – pożądane własności transakcji
Atomic : wykonać się może jedynie w całości lub w ogóle
(DBMS jest odpowiedzialny za zapewnienie)
Consistent : zachowują poprawność zawartości bazy danych
(DBMS może wymusić ograniczenia określone w bazie
danych, ale logika aplikacji musi być też prawidłowa)
Isolated : transakcje muszą być realizowane niezależnie:
częściowe efekty realizacji transakcji T1 nie powinny
wpływać na wynik działania transakcji T2 (nie powinny być
„widoczne” dla transakcji T2) - DBMS odpowiedzialny
Durable: mają trwały charakter i jeśli się zakończyły, to ich
wynik zostanie zachowany nawet w przypadku sytuacji
awaryjnych (DBMS)
Bazy danych – wykład 6
5
Zatwierdzenie transakcji - COMMIT
W języku SQL instrukcja COMMIT
sygnalizuje jawne zakończenie transakcji i
trwałe zapisanie jej efektów w bazie
danych
Bazy danych – wykład 6
6
Odwołanie transakcji - ROLLBACK
W języku SQL instrukcja ROLLBACK
sygnalizuje zakończenie transakcji i
odwołanie efektów jej działania – baza
danych powinna pozostać w stanie sprzed
rozpoczęcia realizacji transakcji
Pewne błędy takie, jak dzielenie przez zero
lub naruszenie ograniczeń (constraint) mogą
wywołać automatyczne zakończenie
transakcji i odwołanie efektów jej działania
Bazy danych – wykład 6
7
Przykład
Załóżmy, że w tabeli Sells(bar,beer,price)
zawarta jest informacja, że bar Joe’s Bar
sprzedaje wyłącznie piwo marki Bud za $2.50 i
piwo marki Miller za $3.00
Sally wyszukuje w tabeli Sells najwyższą i
najniższą cenę piwa sprzedawanego przez Joe’s
Bar
W tym czasie Joe’s Bar przestaje sprzedawać
Bud i Miller, a zamiast nich sprzedawać zaczyna
wyłącznie piwo marki Heineken za $3.50, i Joe
wprowadza tę informację do tabeli Sells
Bazy danych – wykład 6
8
Sekwencja instrukcji Sally
Sally wykonuje następujące dwie
instrukcje SQL oznaczone dalej jako
(min) i (max) :
(max)
SELECT MAX(price) FROM Sells
WHERE bar = ’Joe’’s Bar’;
(min)
SELECT MIN(price) FROM Sells
WHERE bar = ’Joe’’s Bar’;
Bazy danych – wykład 6
9
Sekwencja instrukcji Joe
W tym samym czasie Joe wykonuje
następujące dwie instrukcje, oznaczone
jako (del) i (ins).
(del) DELETE FROM Sells
WHERE bar = ’Joe’’s Bar’;
(ins) INSERT INTO Sells
VALUES(’Joe’’s Bar’, ’Heineken’, 3.50);
Bazy danych – wykład 6
10
Przeplatanie się instrukcji
Jeśli chodzi o kolejność wykonania
pokazanych czterech instrukcji, jedyne
czego można być pewnym to to, że:
(max) wykona się przed (min), i
(del) wykona się przed (ins)
Żeby uzyskać oczekiwany efekt ich
łącznego wykonania musimy pogrupować
instrukcje Sally i Joe w w transakcje
Bazy danych – wykład 6
11
Przykład: niepożądana kolejność
Załóżmy, że instrukcje zostaną wykonane
w tej kolejności: (max)(del)(ins)(min)
{3.50}
Ceny u Joe: {2.50,3.00} {2.50,3.00}
(max)
(del)
(ins)
(min)
Instrukcja:
3.00
3.50
Wynik:
Sally zobaczy, że MAX < MIN!
Bazy danych – wykład 6
12
Poziomy izolacji transakcji
W SQLu zdefiniowano cztery poziomy izolacji
transakcji (ang. isolation levels), określające
dopuszczalny stopień interakcji pomiędzy nimi
Im bardziej ograniczony zakres interakcji tym
lepsze własności (ACID!), ale mniejsza liczba
możliwych do wykonania równolegle instrukcji !
Najbardziej restrykcyjny poziom nosi nazwę
“serializable” – tylko takie transakcje posiadają
własności ACID.
Różny sposób implementacji transkacji przez
różne DBMS.
Bazy danych – wykład 6
13
Poziomy izolacji transakcji (2)
W niektórych implementacjach SQL
dostępna jest instrukcja:
SET TRANSACTION ISOLATION LEVEL X
gdzie X =
1.
2.
3.
4.
SERIALIZABLE
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
Bazy danych – wykład 6
14
Transakcja typu „read uncommitted”
Wróćmy do transakcji Sally = (max) (min) i
Joe’go = (del)(ins)
Transakcja oznaczona jako READ
UNCOMMITTED „widzi” wszelkie zmiany
dokonywane przez inne transakcje, łącznie z
tymi niezatwierdzonymi.
Przykład: Jeśli transakcja Sally jest oznaczona
jako READ UNCOMMITTED, to może ona
zobaczyć cenę 3.50 nawet jeśli Joe odwoła
swoją transakcję (tzw. „dirty read”)
Bazy danych – wykład 6
15
Transakcje typu „read-commited”
Jeśli transakcja Sally oznaczona jest jako
READ COMMITTED, to widzi ona tylko
zatwierdzone dane, ale niekoniecznie
zawsze te same.
Przykład: przy tym poziomie izolacji
przeplatanie się instrukcji jest dozwolone,
np. (max)(del)(ins)(min); jeśli transakcja
Joe’go jest zatwierdzona (COMMIT), to
Sally zobaczy MAX < MIN.
Bazy danych – wykład 6
16
Transakcje typu „repeatable-read”
Transakcja widzi tylko zatwierdzone dane +
jeśli dane są odczytywane wielokrotnie, to są
one za każdym razem identyczne (w sensie
zawartości odczytanych krotek), ale przy
kolejnych odczytach można otrzymać więcej
krotek (ang. phantom tuples)
Bazy danych – wykład 6
17
Przykład: „repeatable read”
Załóżmy, że transakcja Sally jest
oznaczona jako REPEATABLE READ, i
kolejność wykonania instrukcji jest
następująca: (max)(del)(ins)(min)
(max) widzi ceny 2.50 i 3.00
(min) widzi cenę 3.50, ale musi również
widzieć ceny 2.50 i 3.00, ponieważ były
one wcześniej widoczne dla (max)
Bazy danych – wykład 6
18
Transakcje typu „serializable”
Jeśli Sally wykonuje swoją transakcję
(max)(min) z poziomem izolacji
SERIALIZABLE, to jej transakcja będzie
widziała zawartość bazy danych
sprzed lub po wykonaniu transakcji
Joe’go (del)(ins), ale nie pomiędzy.
Czyli transakcja Sally wykonuje się
tak, jakby jej instrukcje wykonywane
były kolejno i nieprzeplatane
instrukcjami żadnej innej transakcji
Bazy danych – wykład 6
19
Poziom izolacji transakcji (3)
Poziom izolacji dotyczy transakcji, która
go określa, a nie pozostałych.
Przykład: Jeśli transakcja Joe’go jest
oznaczona jako serializable, a transakcja
Sally nie, to Sally może odczytać
zawartość bazy danych w chwili, gdy nie
ma żadnych cen piwa dla baru Joe’s Bar.
Bazy danych – wykład 6
20
Perspektywy (views)
Perspektywa jest pseudotabelą zdefiniowaną z
odwołaniem do tabel (zwanych też tabelami
bazowymi) oraz do innych pseudotabel.
Dwa rodzaje:
1. „wirtualne”= nie są one zapisywane w bazie danych;
mają postać zapytania, które po uruchomieniu zwraca
tabelę.
2. materialized = wynik zapytania jest zapisywany w
bazie
Bazy danych – wykład 6
21
Deklarowanie perspektyw
CREATE [MATERIALIZED] VIEW
<name> AS <query>;
Domyślnie tworzona jest perspektywa
wirtualna
Bazy danych – wykład 6
22
Przykład: deklaracja perspektywy
CanDrink(drinker, beer) jest perspektywą
„zawierającą” pary klient-piwo, takie że dany
klient odwiedza przynajmniej jeden bar, w
którym sprzedawane jest dane piwo:
CREATE VIEW CanDrink AS
SELECT drinker, beer
FROM Frequents, Sells
WHERE Frequents.bar = Sells.bar;
Bazy danych – wykład 6
23
Przykład: używanie perspektywy
Perspektywę można przeszukiwać tak samo
jak tabelę bazową
W ograniczonym stopniu dopuszczalne jest
również modyfikowanie zawartości perspektyw, o
ile w rozsądny sposób tłumaczy się ono na
modyfikowanie jednej z tabel bazowych, do
których odwołuje się perspektywa.
Przykład zapytania względem perspektywy:
SELECT beer FROM CanDrink
WHERE drinker = ’Sally’;
Bazy danych – wykład 6
24
Materialized Views
Problem: za każdym razem kiedy
zmieniana jest tabela bazowa może to
wymagać zmiany w materialized view.
Zbyt kosztowne jest rekonstruowanie
zawartości takiej perspektywy przy
każdorazowej zmianie tabel bazowych.
Rozwiązanie: Regularne automatyczne
rekonstruowanie materialized view.
Bazy danych – wykład 6
25
Indeksy
Index = struktura danych używana do
przyspieszenia dostępu do danych na
podstawie zawartości ich jednej lub kilku
kolumn.
Różne typy (łącznie z np. tablicą haszującą),
ale w DBMS najpopularniejsze są
zrównoważone drzewa wyszukiwań, a w
szczególności B-drzewa.
Bazy danych – wykład 6
26
Tworzenie indeksów
Przykład typowej składni:
CREATE INDEX BeerInd ON
Beers(manf);
CREATE INDEX SellInd ON
Sells(bar, beer);
Bazy danych – wykład 6
27
Użycie indeksów
Dla zadanej wartości v kolumny a, na
podstawie indeksu możemy szybko
dotrzeć do wierszy tabeli, w których w
kolumnie a występuje wartość v.
Przykład: z użyciem indeksów BeerInd i
SellInd odnaleźć ceny marek piwa
produkowanych przez browar Pete’s i
sprzedawanych przez bar Joe’ego.
Bazy danych – wykład 6
28
Użycie indeksów --- (2)
SELECT price FROM Beers, Sells
WHERE manf = ’Pete’’s’ AND
Beers.name = Sells.beer AND
bar = ’Joe’’s Bar’;
1. Użyj indeksu BeerInd do znalezienia
wszystkich marek piwa produkowanych
przez browar Pete’s.
2. Następnie, użyj indeksu SellInd do
znalezienia cen tych marek piwa w barze
Joe’s Bar
Bazy danych – wykład 6
29
Dostrajanie bazy danych
Właściwy dobór indeksów ma istotne znaczenie
dla szybkości działań na bazie danych
Zalety: istnienie indeksu przyspiesza
wykonanie zapytań, które odnoszą się do
indeksowanych wartości
Wady: istnienie indeksu spowalnia dodawanie,
usuwanie i modyfikowanie wierszy w tabeli,
której dotyczy, gdyż indeks musi zostać
również zmodyfikowany
Bazy danych – wykład 6
30

Podobne dokumenty