Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Systemy rozproszone W. Bartkiewicz Wykład 11. Transakcje.

Podobne prezentacje


Prezentacja na temat: "Systemy rozproszone W. Bartkiewicz Wykład 11. Transakcje."— Zapis prezentacji:

1 Systemy rozproszone W. Bartkiewicz Wykład 11. Transakcje

2 Współbieżność w systemach rozproszonych Synchronizacja współbieżnych procesów w systemach rozproszonych stwarza szereg dodatkowych problemów. Najważniejsze z nich to: –Problem czasu w aplikacji rozproszonej. –Brak centralnej pamięci, dostępnej dla współbieżnych składników aplikacji, w której umieścić można mechanizmy synchronizacyjne. Czas w aplikacji rozproszonej: –Co to znaczy, że dwa zdarzenia w aplikacji rozproszonej zachodzą współbieżnie? –Kiedy możemy powiedzieć, że jedno zdarzenie poprzedza drugie? Brak centralnej pamięci: –W dotychczas rozważanych zagadnieniach synchronizacyjnych istniała wspólna pamięć, dostępna dla wątków (procesów) aplikacji, w której znajdowały się mechanizmy synchronizacyjne. –Zmienne globalne (wątki tego samego procesu), jądro systemu (wątki różnych procesów. –Gdy procesy pracują na różnych maszynach, takiej pamięci nie ma. Synchronizacja musi odbywać się więc poprzez operacje komunikacyjne.

3 Pojęcie i własności transakcji Z koncepcją wzajemnego wykluczania ściśle wiąże się pojęcie transakcji. Przez transakcję rozumiemy grupę operacji, które muszą być wykonane przez serwer wspólnie. –Transakcja przelewu wymaga wypłaty z jednego konta i wpłaty na drugie konto. Transakcje pozwalają w prosty sposób grupować zadania i zapewniają wykonanie ich z odpowiednimi gwarancjami. –Transakcja określa m.in. kolejność w jakiej wykonywane są operacje. –Ważną cechą transakcji jest ochrona dzielonych zasobów przed jednoczesnym dostępem współbieżnych procesów. –Dają one również możliwość wykonywania pewnych operacji w sposób niepodzielny, mimo że tak naprawdę może to być grupa wielu mniejszych operacji na różnych danych. –Poza tym jeśli taka transakcja jest wycofywana z pewnych powodów, stan systemu może być przywrócony do momentu sprzed rozpoczęcia jej wykonywania.

4 Pojęcie i własności transakcji Transakcje były wykorzystywane głównie do tej pory w systemach bazodanowych, jednakże coraz szerzej stosowane są w systemach operacyjnych (również rozproszonych). Wszystkie transakcje charakteryzuje zbiór pewnych podstawowych właściwości. Są nimi: niepodzielność lub atomowość (ang. atomicity), spójność (ang. consistency), izolacja (ang. isolation), trwałość (ang. durability). Zestaw tych czterech własności oznaczany jest skrótem ACID od pierwszych liter ich nazw.: –Niepodzielność (Atomicity) – transakcja musi działać na zasadzie wszystko albo nic, a więc albo dobiega ona końca i jest realizowana w całości, albo nie jest ona realizowana w ogóle. –Jest to przy tym jedna, niepodzielna operacja. W trakcie jej wykonywania inne procesy (wątki) nie mogą mieć wglądu w żaden z jej stanów pośrednich (niezależnie od tego, czy są one powiązane z transakcjami, czy nie). –Transakcja ma charakter niepodzielny nawet w przypadku awarii serwera.

5 Pojęcie i własności transakcji –Spójność (Consistency) – transakcja przeprowadza system z jednego stanu spójnego w drugi. –Jeśli w systemie istnieją pewne niezmienniki, które powinny być zawsze zachowane, to jeśli były spełnione przed transakcją, muszą być spełnione również i po niej. –Naruszenia niezmienników, w sposób naturalny pojawiające się podczas realizacji transakcji, nie są widoczne na zewnątrz transakcji. –Izolacja (Isolation) – Każda transakcja musi być wykonywana w sposób nie kolidujący z innymi transakcjami. –Jeśli dwie lub więcej transakcji przebiega jednocześnie, to dla każdej z nich wynik końcowy jest taki, jakby wszystkie transakcje wykonywano po kolei, według pewnego (zależnego od systemu) porządku. –Trwałość (Durability) – Cokolwiek by się działo po zatwierdzeniu transakcji, jej wyniki są nieodwołalne. Żadna awaria wydarzająca się po zatwierdzeniu nie może cofnąć wyników, ani spowodować ich utraty.

6 Organizacja usług transakcyjnych Standardowy interfejs usług transakcyjnych obejmuje obok operacji merytorycznych, trzy podstawowe operacje organizujące transakcję: –Otwórz transakcję – rozpoczyna nową transakcję i zwraca jednoznaczny identyfikator transakcji. –Zamknij transakcję – kończy transakcję, próbując ją zatwierdzić lub zaniechać. –Zaniechaj transakcji – powoduje zaniechanie transakcji. W normalnych warunkach usługi transakcyjne odnotowują początek każdej transakcji i wykonują zamówienia klienta aż do otrzymania żądania zamknięcia transakcji. –Jeśli transakcja przebiegła normalnie, to serwer przesyła komunikat o tym, że transakcja została zatwierdzona (committed). Stanowi to dla klienta poręczenie, że wszystkie zmiany wymagane w transakcji zostały trwale zapisane i wszystkie przyszłe transakcje sięgające po te same dane będą miały do czynienia ze skutkami wszystkich zmian wykonanych podczas transakcji.

7 Organizacja usług transakcyjnych Transakcja może też być także zaniechana (aborted) z powodów związanych z jej własną naturą, wskutek konfliktów z innymi transakcjami bądź z powodu awarii procesów lub sprzętu. –W przypadku zaniechania transakcji usługi transakcyjne muszą zapewnić, że żadne jej skutki nie będą widoczne dla przyszłych transakcji – ani w obiektach danych, ani w ich kopiach w pamięci trwałej. –Transakcja może zostać również zaniechana przez klienta, poprzez skierowanie do serwera żądania zaniechania transakcji.

8 Typy transakcji Ciąg operacji o własnościach ACID nazywamy transakcją płaską (flat transaction). Jest to najprostszy i najczęściej wykorzystywany typ transakcji. Brak możliwości częściowego zatwierdzania lub wycofania wyników transakcji w przypadku, gdy np.: –trzeba długo czekać na część wyników, –część transakcji się nie powiodła, ale mimo wszystko chcemy zatwierdzić dotychczasowy częściowy wynik.

9 Typy transakcji Czasami z charakteru transakcji oryginalnej wynika jej logiczny podział na szereg podtransakcji. Transakcję tego typu nazywamy transakcją zagnieżdżoną (nested transaction). Transakcje zagnieżdżone mogą tworzyć bardziej rozbudowane, kilkupoziomowe hierarchie. Transakcje zagnieżdżone przydatne są z dwu podstawowych powodów: –Podtransakcje zagnieżdżone na jednym poziomie zazwyczaj mogą przebiegać współbieżnie z innymi transakcjami zagnieżdżonymi na tym samym poziomie hierarchii. –Transakcje zagnieżdżone można zatwierdzać lub wycofywać niezależnie. Są one bardziej odporne, ponieważ zaniechanie podtransakcji niekoniecznie musi oznaczać zaniechania jej transakcji rodzicielskiej. Może ona zamiast tego podjąć pewne działania zastępcze. Zaniechanie transakcji rodzicielskiej jednakże zawsze oznacza konieczność zaniechania wszystkich podtransakcji, nawet jeśli zostały one już zakończone. Własność trwałości w przypadku transakcji zagnieżdżonej rozumiemy więc jako trwałość transakcji szczytowej.

10 Typy transakcji W przypadku gdy transakcja działa na danych rozproszonych na różnych maszynach, mówimy o transakcji rozproszonej (distributed transaction). Transakcje zagnieżdżone niekoniecznie są transakcjami rozproszonymi. –Dla uwypuklenia głównej różnicy: transakcje zagnieżdżone stosuje się ze względu na logikę ich pracy, natomiast transakcje rozproszone ze względu na rozproszenie danych, na których operują. Głównym problemem transakcji rozproszonych jest konieczność używania oddzielnych algorytmów do blokowania danych i zatwierdzania całej transakcji.

11 Implementacja transakcji Prywatna przestrzeń robocza Dwie podstawowe metody implementacji transakcji: –Prywatna przestrzeń robocza oraz rejestrowanie z wyprzedzeniem. Pierwsze podejście polega na stworzeniu w momencie uruchomienia transakcji, prywatnej przestrzeni roboczej, w której umieszcza się wszystkie dane, do których transakcja ma dostęp. –W trakcie działania transakcja operuje więc tylko na swojej prywatnej przestrzeni, a nie bezpośrednio na oryginalnych danych. Nie ma potrzeby tworzenia kopii danych, które są tylko odczytywane przez transakcję. Można tu wykorzystać oryginalne dane. –Transakcja kopiuje do swojej przestrzeni roboczej tylko tablicę odnośników do bloków potrzebnych plików z danymi. –Podczas odczytu odczytywane są po prostu oryginalne dane. –Przy zapisie tworzona jest kopia modyfikowanego bloku (tzw. cień bloku – ang. shadow block) do którego zapisywane są nowe dane. –Po zatwierdzeniu transakcji odnośniki do zmodyfikowanych bloków zastępują oryginalne bloki.

12 Implementacja transakcji Prywatna przestrzeń robocza Przykład realizacji transakcji w systemie plików. –Na potrzeby transakcji zapamiętywane są w jej przestrzeni roboczej indeksy bloków pliku, na których działa. –Gdy transakcja modyfikuje blok 1, zostaje on skopiowany i powstaje cień bloku, 1. –Dodatkowo transakcja dodała nowy blok, do którego indeks pamiętany jest w prywatnej przestrzeni adresowej do czasu zatwierdzenia transakcji.

13 Implementacja transakcji Rejestrowanie z wyprzedzeniem Rejestrowanie z wyprzedzeniem (ang. writeahead log) jest metodą realizacji transakcji, która pozwala na modyfikowanie oryginalnych plików, z których korzysta transakcja. –Zanim jednak następuje sama operacja zapisu, fakt ten odnotowywany jest w specjalnym rejestrze w postaci rekordu z informacjami o transakcji, modyfikowanym przez nią pliku i bloku oraz nową i starą wartością bloku. W momencie gdy transakcja zostaje zatwierdzona, do wspomnianego rejestru wpisywany jest tylko fakt samego zatwierdzania, gdyż dane zostały już wcześniej zaktualizowane. –Kiedy jednak transakcja zostaje anulowana, przydatny okazuje się rejestr, który służy do przywrócenia stanu sprzed transakcji. –Operacja przywracania polega w skrócie na odczytaniu od końca rekordów rejestru i wycofaniu (ang. rollback) zapisanych w nim zmian.

14 Implementacja transakcji Rejestrowanie z wyprzedzeniem

15 Transakcje Współbieżność wykonywania Serwer usług transakcyjnych musi synchronizować współbieżnie wykonywane operacje, w stopniu wystarczającym dla zapewnienia właściwości ACID transakcji. Oczywistym sposobem realizacji tego zadania jest sekwencyjne wykonywanie transakcji – jedna za drugą, po jednej w danej chwili, w pewnym dowolnym porządku. Rozwiązanie to jest jednak oczywiście nie do przyjęcia dla serwerów, których zasoby są interakcyjnie dzielone między wielu użytkowników. Celem każdego serwera usług transakcyjnych jest maksymalizacja stopnia współbieżności. Dlatego dozwala się na współbieżne wykonywanie operacji różnych transakcji, jeśli tylko ich skutki będą takie same jak wówczas, gdyby wykonywano je po kolei, tzn. tak by były one równoważne szeregowo (serially equivalent).

16 Transakcje Menedżer (zarządca) transakcji Usługi transakcyjne realizowane są zazwyczaj w formie menedżera (zarządcy) transakcji (transaction manager). –Menedżer transakcji zarządza całością transakcji, zapewniając jej niepodzielność trwałość, obsługując podtransakcje, itp. –Rzeczywiste operacje na danych wykonywane są przez menedżera (zarządcę) danych (data manager). Wykonuje on elementarne operacje czytania i zapisu, nie wiedząc nic o transakcjach, które je inicjują. –Za właściwe sterowanie współbieżnością odpowiada planista (scheduler). Zapewnia on izolację i spójność transakcji, planując operacje czytania i pisania, aby określić, która transakcja i kiedy może przekazać je menedżerowi danych. –Planista obok typowych problemów wzajemnego wykluczania na pojedynczym obiekcie danych, takich jak konflikty pisanie-pisanie lub czytanie-pisanie musi rozwiązać szereg zagadnień powstających na poziomie całej transakcji. Menedżer transakcji Planista Menedżer danych Transakcje

17 Transakcje Problem utraconej aktualizacji Problem utraconej aktualizacji pojawia się wtedy, gdy dwie transakcje aktualizujące odczytają starą wartość zmiennej, a następnie używają jej do obliczenia nowej wartości. Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 40) Wpłata(B, 40) Transakcja U: Wypłata(C, 50) Wpłata(B, 50) StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 40) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 40) StanKonta2 = C.Czytaj() C.Pisz(StanKonta2 - 50) StanKonta2 = B.Czytaj() B.Pisz(StanKonta2 + 50)

18 Transakcje Problem utraconej aktualizacji Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 40) Wpłata(B, 40) Transakcja U: Wypłata(C, 50) Wpłata(B, 50) StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 40) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 40) StanKonta2 = C.Czytaj() C.Pisz(StanKonta2 - 50) StanKonta2 = B.Czytaj() B.Pisz(StanKonta2 + 50)

19 Transakcje Problem niespójnego odzyskania Problem niespójnych odzyskań może pojawić się wtedy, gdy transakcja odzyskująca działa współbieżnie z aktualizującą. Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 50) Wpłata(B, 50) Transakcja U: StanOddziału() StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 50) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 50) StanKonta2 = A.Czytaj() StanKonta2 += B.Czytaj() StanKonta2 += C.Czytaj()

20 Transakcje Problem niespójnego odzyskania Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 50) Wpłata(B, 50) Transakcja U: StanOddziału() StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 50) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 50) StanKonta2 = A.Czytaj() StanKonta2 += B.Czytaj() StanKonta2 += C.Czytaj()

21 Transakcje Współbieżność a rekonstruowalność Plan transakcji równoważny szeregowo (szeregowalny) wymaga więc aby wszystkie dostępy transakcji do określonego obiektu danych były uporządkowane ze względu na dostępy innych transakcji. –Wszystkie kolidujące pary działań dwu transakcji powinny być wykonywane w tym samym porządku. Dodatkowe problemy pojawiają się w związku z rekonstruowalnością transakcji. –Usługi transakcyjne muszą zapamiętywać wyniki wszystkich zatwierdzonych transakcji i usuwać ślady wszystkich transakcji zaniechanych. –Usługi transakcyjne muszą więc brać pod uwagę ewentualne zaniechania transakcji, zapobiegając ich oddziaływaniu na inne transakcje współbieżne.

22 Transakcje Problem zabrudzonego czytania Problem wynika z interakcji między operacją czytania jednej transakcji, a wcześniejszą operacją pisania innej transakcji, odnoszących się do tego samego obiektu danych. Mówimy, że transakcja taka wykonała zabrudzone czytanie (dirty read). Gdy dojdzie do wycofania wcześniejszej transakcji (T), transakcja realizowana później (U) wykonana zostanie nieprawidłowo. Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 40) Wpłata(B, 40) Transakcja U: Wypłata(A, 50) StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 40) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 40) StanKonta2 = A.Czytaj() A.Pisz(StanKonta2 – 50) 60 10

23 Transakcje Problem zabrudzonego czytania Aby rozwiązać problem, każda transakcja, której grozi zabrudzone czytanie (w naszym przypadku U), jest wycofywana, z chwilą wycofania transakcji pierwszej (transakcja T). Jeśli transakcja U zakończyłaby się przed zakończeniem T, to opóźnia ona swoje zatwierdzenie (lub wycofanie), do chwili zatwierdzenia (lub wycofania) T. Stany kont: A=100, B=200, C=300 Transakcja T: Wypłata(A, 40) Wpłata(B, 40) Transakcja U: Wypłata(A, 50) StanKonta1 = A.Czytaj() A.Pisz(StanKonta1 - 40) StanKonta1 = B.Czytaj() B.Pisz(StanKonta1 + 40) StanKonta2 = A.Czytaj() A.Pisz(StanKonta2 – 50) 60 10

24 Transakcje Problem zabrudzonego czytania Generalnie jeśli jakieś transakcje korzystają z wyników działania innej transakcji, to w razie jej zaniechania muszą również zostać zaniechane. Z kolei ich zaniechanie może pociągać za sobą konieczność zaniechania coraz to dalszych transakcji. Sytuację taką nazywa się zaniechaniem kaskadowym (cascaded abort). Aby uniknąć zaniechań kaskadowych, transakcjom pozwala się na czytanie tylko takich obiektów danych, które zapisano za pomocą transakcji zatwierdzonych. Aby to zapewnić każda operacja czytania na obiekcie musi być opóźniana do czasu, gdy transakcje zapisujące ten sam obiekt zostaną zatwierdzone lub zaniechane.

25 Transakcje Problem przedwczesnego zapisu Problem wynika z interakcji między operacjami pisania, odnoszącymi się do tego samego obiektu danych. Gdy dojdzie do wycofania wcześniejszej transakcji (T), po zatwierdzeniu transakcji realizowanej później (U) to przywrócony zostanie stan początkowy 100 sprzed obydwu transakcji. Aby zagwarantować poprawne wyniki, operacje pisania muszą zostać opóźnione aż do czasu zatwierdzenia lub zaniechania wcześniejszych transakcji aktualizujących te same obiekty danych. Stan konta: A=100 Transakcja T: Ustaw(A, 300) Transakcja U: Ustaw(A, 200) A.Pisz(300)300 A.Pisz(200)200

26 Transakcje Współbieżność wykonywania W praktyce stosuje się trzy podstawowe podejścia do sterowania współbieżnością: –Blokowanie (locking). Każdy obiekt danych zostaje zablokowany (zajęty) przez pierwszą sięgającą po niego transakcję, wskutek czego żadna inna transakcja nie może z niego skorzystać, dopóty, dopóki pierwsza transakcja nie zostanie zatwierdzona lub zaniechana. –Optymistyczne sterowanie współbieżnością. Pokłada się tu nadzieję, że nie wystąpią żadne konflikty w dostępie do danych. Jeśli dojdzie do konfliktu z innymi współbieżnymi transakcjami, to nastąpi zaniechanie transakcji i trzeba będzie powtórzyć ją od nowa. –Sterowanie z wykorzystaniem znaczników czasu. W tym podejściu każda transakcja ma znacznik czasu, a obiekty danych otrzymują znaczniki czasu przy każdym kontakcie. Zaniechanie i wznowienie transakcji następuje w sytuacji, gdy jest ona spóźniona, aby wykonać operację na danym obiekcie.

27 Transakcje Blokowanie dwufazowe Jedną z najpopularniejszych metod sterowania współbieżnością jest tzw. algorytm blokowania dwufazowego (ang. two-phase locking – 2PL) –Algorytm blokowania dwufazowego składa się z dwóch faz: fazy wzrostu (ang. growing phase) oraz fazy zmniejszania (ang. shrinking phase). –W pierwszej fazie transakcja może blokować zasoby, ale nie wolno jej zwalniać zasobów, które wcześniej już zablokowała. –W drugiej fazie transakcja może zwalniać zasoby, lecz nie wolno jej blokować żadnych nowych zasobów. Jeżeli wszystkie transakcje działają według tego schematu, to plany utworzone na skutek ich przeplotu są uszeregowane. –Wszystkie kolidujące pary operacji muszą być wykonywane w tym samym porządku, ponieważ transakcji nie pozwala się na zakładanie nowych blokad po zwolnieniu którejś z nich. –Rozwiązuje to problem utraconych aktualizacji i niespójnych odzyskań.

28 Transakcje Blokowanie dwufazowe Wraz z upływem czasu rośnie liczba założonych blokad. Gdy zostaną założone wszystkie blokady, następuje tzw. punkt blokady i może rozpocząć się przetwarzanie odpowiednich danych. Po zakończeniu operacji blokady są zwalniane, co ilustruje faza zmniejszania na wykresie.

29 Transakcje Ścisłe blokowanie dwufazowe Ścisłe blokowanie dwufazowe (ang. strict two-phase locking) jest realizowane w systemach, gdzie faza zmniejszania nie występuje dopóki transakcja nie zostanie zakończona. –Tak więc transakcja, która chce czytać lub zapisywać obiekt danych, musi będzie opóźniana do czasu aż inne transakcje, które zapisały ten sam obiekt danych zostaną zatwierdzone lub zaniechane. Atutem takiego rozwiązania jest to, że transakcja zawsze czyta wartości zapisane tylko przez zatwierdzone transakcje. –Wartości czytane w transakcji są zawsze zapisane przez transakcję zatwierdzoną, dzięki czemu nie trzeba anulować transakcji z powodu wykorzystania w obliczeniach danej, której nie powinna oglądać. –Rozwiązuje to problem zabrudzonych czytań i niespójnych odzyskań, bez konieczności występowania zaniechań kaskadowych.

30 Transakcje Zakładanie blokad W praktyce serwery usług transakcyjnych nie stosują prostych blokad w trybie wyłączności (exclusive lock), ale blokady do czytania (read lock) oraz do pisania (write lock). –Umożliwia to zwiększenie współbieżności poprzez współdzielone blokowanie (shared locking) do czytania. Reguły powstawania konfliktów są prostym rozszerzeniem charakteryzowanego wcześniej problemu czytelników-pisarzy. –Jeśli na określony obiekt danych nie ma założonych żadnych blokad, transakcja może założyć zarówno blokadę do czytania jak i zapisu. –Jeśli operację czytania określonego obiektu danych wykonała już pewna transakcja T, blokując go do czytania, to współbieżna transakcja U nie może zamówić blokady tego obiektu do pisania, dopóki transakcja T nie zostanie zatwierdzona lub anulowana. Transakcja U może natomiast założyć kolejna blokadę do czytania. –Jeżeli transakcja T zablokowała obiekt danych do pisania, to żadna inna transakcja współbieżna U nie może otrzymać blokady zarówno do pisania jak i do czytania tego obiektu.

31 Transakcje Zakładanie blokad Przez rozszerzanie blokady (lock promotion) rozumiemy zamianę jednej blokady na inna, silniejszą, tj. taką, która wymusza większe wykluczanie działań. –Transakcja dzieląca blokadę do czytania z inną transakcją nie może jej rozszerzyć na blokadę do pisania. Taka transakcja musi po zamówieniu blokady do pisania poczekać aż inne transakcje pozwalniają obiekty zablokowane do czytania. Degradowanie blokady utrzymywanej w transakcji przed jej zatwierdzeniem (lub wejściem w fazę zmniejszania) w jest niebezpieczne z punktu widzenia szeregowalności, tak więc jest sprzeczne z zasadami protokołu dwufazowego blokowania.

32 Transakcje Blokady – zakleszczenia Należy zwrócić uwagę na jeden istotny fakt, że algorytm blokowania dwufazowego nie uwalnia nas od problemu zakleszczenia, w wypadku gdy dwie transakcje ubiegają się o te same zasoby tylko w odwrotnej kolejności. –Zakleszczenie transakcji jest stanem w którym każdy członek pewnej grupy transakcji oczekuje na zwolnienie zasobu zajmowanego (blokowanego) przez innego członka grupy. Zależności między blokowanymi transakcjami mogą mieć również charakter pośredni.

33 Transakcje Blokady – zakleszczenia Można tutaj wykorzystać pewien z góry ustalony porządek przydzielania zasobów. –Transakcja może np. z góry próbować założyć blokady na wszystkie niezbędne dla niej obiekty danych. Jeśli będzie to niemożliwe, zostaje wycofana. –Transakcja taka nie może wejść w stan zakleszczenia z innymi transakcjami, lecz zbytecznie ogranicza dostęp do dzielonych zasobów. –Ponadto nie zawsze możliwe jest określenie na początku transakcji, które obiekty danych będą w użyciu. Zakleszczeniom można zapobiegać poprzez strategie blokowania danych w innych określonych porządkach, ale niemal zawsze powoduje to przedwczesne zajmowanie zasobów i ograniczanie współbieżności.

34 Transakcje Blokady – zakleszczenia Inna metodą jest tworzenie i przechowywanie grafu procesów, które posiadają blokady. –Graf taki nazywamy grafem oczekiwania (wait-for graph). –Wierzchołki grafu reprezentują transakcje (czy też raczej współbieżne wątki (procesy) realizujące transakcje). Krawędzie oznaczają relacje oczekiwania jednych transakcji na inne. –Z zakleszczeniem mamy do czynienia, gdy w grafie występują cykle. Serwer może znajdując cykle w grafie, wykrywać zakleszczenia. –Po wykryciu cyklu wybiera się transakcję do zaniechania, aby przerwać cykl. –Wybór transakcji do zaniechania nie jest rzeczą prostą. Do czynników, które można wziąć pod uwagę należą wiek transakcji oraz liczba cykli w których występuje.

35 Transakcje Blokady – zakleszczenia Jeszcze inne podejście bazuje, na znanym maksymalnym czasie przez jaki może być założona blokada, tak że po wykryciu blokady przez inny proces może on stwierdzić po pewnym czasie, że wystąpiło zakleszczenie. –Limity czasu trwania blokady (lock timeouts) są powszechnie stosowaną metodą rozwiązywania problemu zakleszczeń. –Transakcja której przerwano blokadę zazwyczaj zostaje zaniechana. Kilka problemów: –Transakcje zostają niekiedy zaniechane wskutek uwrażliwienia się ich blokad, choć w rzeczywistości nie było żadnego zakleszczenia. –Określenie właściwej długości limitu czasu może być bardzo trudne w przypadku transakcji długotrwałych, a zwłaszcza interaktywnych. –Serwer nie może wybrać transakcji do zaniechania, tak więc nie może optymalizować tego procesu poprzez jednoczesne usunięcie wielu zakleszczeń.

36 Transakcje Pesymistyczne porządkowanie według znaczników czasu Kolejny algorytm to pesymistyczne porządkowanie według znaczników czasu (ang. pessimistic timestamp ordering). –Każda transakcja T jest opisywana znacznikiem czasowym t(T). K –Każda zmienna x również opatrywana jest dwoma znacznikami czasowymi: znacznikiem czasu zapisu tz(x), znacznikiem czasu odczytu tc(x). –Wartość tz(x) jest równa znacznikowi transakcji, która jako ostatnio pisała do zmiennej x, analogicznie jest z wartością tc(x), z tym że operacja dotyczy oczywiście odczytu. –Algorytm wymaga, aby znaczniki czasu były unikalne. W tym celu można zastosować np. algorytm Lamporta. W wypadku wystąpienia konfliktu między operacjami, w pierwszej kolejności obsługiwana jest ta, która ma mniejszy znacznik czasowy.

37 Transakcje Pesymistyczne porządkowanie według znaczników czasu Zobaczmy teraz co się dzieje w przypadku, kiedy planista otrzyma od transakcji T zlecenie na operację odczytu lub zapisu zmiennej x. –Jeżeli transakcja zleca odczyt, planista porównuje wartości znacznika t transakcji z wartością tz(x). –Jeżeli wystąpił zapis na zmiennej x w momencie, kiedy transakcja T była już wykonywana, czyli gdy t < tz(x), T musi zostać zaniechana. –W przeciwnym wypadku T wykonuje operację, a wartość tc(x) zostaje ustawiona na max[t, tc(x)]. Podobna sytuacja występuje dla operacji zapisu. –Po nadejściu zlecenia zapisu, porównujemy wartości t oraz tc(x). –Jeśli t < tc(x), transakcja zostaje zaniechana, gdyż zmienna x została w tym przypadku odczytana po rozpoczęciu transakcji T. –Gdy zachodzi natomiast sytuacja odwrotna operacja może być wykonana, a wartość tz(x) odpowiednio ustawiona na max[t, tz(x)].

38 Transakcje Pesymistyczne porządkowanie według znaczników czasu Porównując ten algorytm do algorytmu blokowania dwufazowego, można zauważyć, że przeploty operacji, które są akceptowalne dla jednego algorytmu, niekoniecznie są akceptowalne dla drugiego i odwrotnie. Zaletą tego algorytmu jest to, że uwalnia nas od problemu zakleszczania. Rozważmy przykład trzech transakcji T0, T1 oraz T2. –Dodatkowo zakładamy, że transakcja T0 wykonywała się jako pierwsza przed rozpoczęciem pozostałych transakcji i korzystała z wszystkich danych, na których operują transakcje T1 oraz T2. –Oznacza to, że operacje zapisu i odczytu dla zmiennych są oznaczone na początku znacznikiem czasu transakcji T0. –Ponadto niech t(T1) < t(T2), czyli transakcja T1 rozpoczęła się przed transakcją T2.

39 Transakcje Pesymistyczne porządkowanie według znaczników czasu Na początku rozpatrzmy odczyt zmiennej x przez transakcję T1 dla scenariusza przedstawionego w przykładzie 1. –Transakcja T0, która działała od dłuższego czasu wykonała zapis. –Po tej operacji zapisu widzimy, że rozpoczęła się transakcja T1 i na tym kończy się sekwencja operacji. –Nie występuje dalej żadna operacja zapisu na zmiennej x, która mogłaby powodować konflikt z operacją odczytu x. –W związku z tym odczyt zmiennej x może być wykonany

40 Transakcje Pesymistyczne porządkowanie według znaczników czasu Zajmijmy się teraz przykładem 2., gdzie transakcja T1 żąda zapisu zmiennej x. –Są tu dwie kolejne operacje zapisu i odczytu x wykonane przez transakcję T0. –Po nich rozpoczyna się transakcja T1, która chce następnie pisać do zmiennej x. –Ponieważ transakcja T1 nie została jeszcze zatwierdzona, zapis wykonywany jest tymczasowo do momentu zatwierdzenia transakcji.

41 Transakcje Pesymistyczne porządkowanie według znaczników czasu W ostatnim przykładzie: –Transakcja T1 również żąda zapisu x, ale w trakcie jej trwania, a przed żądanym przez nią zapisem, wystąpił zapis wykonany przez inną transakcję T2. –Transakcja T1 musi zostać zaniechana.

42 Transakcje Optymistyczne porządkowanie według znaczników czasu Ostatni algorytm to optymistyczne porządkowanie według znaczników czasu (ang. optimistic timestamp ordering). –Optymistyczne sterowanie współbieżnością transakcji jest kolejnym podejściem do jednoczesnego wykonywania kilku transakcji. –Ogólna idea polega na tym, że transakcja jest wykonywana nawet w przypadku, kiedy występują konflikty. –Ich rozwiązanie jest odkładane do czasu ewentualnego zatwierdzania. –Jeżeli okaże się, że jakaś inna transakcja T1 zmieniła dane od czasu rozpoczęcia naszej transakcji T2, to T2 zostaje zaniechana. W przeciwnym razie T2 zostaje zatwierdzona. Zwróćmy uwagę, że wraz z zastosowaniem takiego podejścia do sterowania współbieżnością, można wykorzystać w transakcjach prywatną przestrzeń roboczą. –W ten sposób każda transakcja może działać lokalnie bez przejmowania się innymi transakcjami. Brak zakleszczeń, gdyż transakcje w trakcie działania nie zajmują się konfliktami i działają dalej.

43 Transakcje Zatwierdzanie transakcji rozproszonych Menedżer transakcji rozproszonych musi zarządzać ich wykonaniem na różnych serwerach. Niepodzielność transakcji wymaga zaniechania całości transakcji na wszystkich serwerach, w przypadku gdy choćby jeden z nich zakomunikuje o zaniechaniu swojej części transakcji. Wymaga to zastosowania tzw. dwufazowego protokołu zatwierdzenia transakcji rozproszonej (two-phase commitment protocol): –W pierwszej fazie każdy serwer głosuje za zatwierdzeniem lub zaniechaniem transakcji. Z chwilą zagłosowania za zatwierdzeniem transakcji, serwer nie może już zaniechać swojej części, tak więc musi być pewny, że będzie w stanie wykonać swoje operacje, nawet jeśli w międzyczasie uległby awarii i podjął pracę od nowa. –W drugiej fazie każdy serwer uczestniczący w transakcji realizuje wspólną decyzję. Jeśli którykolwiek z nich głosował za zaniechaniem, to wszystkie serwery zaniechają transakcji. Jeśli wszystkie serwery głosowały za zatwierdzeniem podejmowana jest decyzja o zatwierdzeniu całej transakcji.


Pobierz ppt "Systemy rozproszone W. Bartkiewicz Wykład 11. Transakcje."

Podobne prezentacje


Reklamy Google