Transakcje Flashcards

1
Q

Jakie poziomy izolacji mogą zapewniać bazy danych? Jakie z nich implementuje Postgresql? Który z nich jest najczęściej domyślny?

A

Read Uncommited
Read Commited
Repeatable Read
Serializable

Postgresql implementuje trzy ostatnie, a jego domyślnym poziomem izolacji jest Read Commited.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Co oznacza skrót ACID w kontekście baz danych?

A

A - Atomicity (wg DDIA powinno to raczej być Abortability)
C - Consistency
I - Isolation
D - Durability (zazwyczaj oznaczać to będzie zapis na dysku twardym)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Jakim zjawiskom zapobiega poziom izolacji “Read commited”? Jak te gwarancje są zapewniane?

A

Zapobiega: dirty readom i dirty write’om.
Aby zapobiec dirty write’om, transakcja, która chce zaktualizować wiersz, musi uzyskać lock na tym wierszu (exclusive lock). Inna transakcja, która chciałaby nadpisać tą wartość, musi zaczekać aż ta pierwsza zakończy się.
Teoretycznie do zapobieżenia dirty readom też można być użyć locków, ale bazy danych implementują bardziej wydajny mechanizm. Dla wierszy, które zostały nadpisane przez transakcję w trakcie, trzymają starą i nową wartość tego wiersza. Czytającym ten wiersz transakcjom zwracają starą wartość.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

W jakich przypadkach poziom izolacji “Read Commited” będzie niewystarczający?

A

Poziom izolacji “Read committed” może okazaćsię niewystaraczający dla transakcji, które potrzebują czytać spójny obraz danych z jednego momentu, np. dla transakcji analitycznej lub czytania stanu bazy danych dla stworzenia backupu (moglibyśmy mieć część wierszy zbackupowanych z jednego momentu, część z innego). Inny przykład: integrity checks.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

W jaki sposób bazy danych implementują izolację na poziomie “Read Commited”?

A

Lock na wierszach nadpisywanych oraz alternatywnie przetrzymywanie dwóch wersji wiersza - ostatni zcommitowany stan oraz jego niescommitowane nadpisanie.

Alternatywnie bazy danych, które implementują Snapshot Isolation, mogą użyć tego mechanizmu - każdy read i write zaczyna się nowym TXID (transaction ID).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Jakie gwarancje daje poziom izolacji “Snapshot Isolation”? Jak ten poziom izolacji jest zaimplementowany?

A

Zapewnia “no dirty read” oraz “no dirty write”, zapobiega “read skew” (obserwacji bazy danych w niespójnym stanie; przykład z książki to czytanie stanu dwóch kont bankowych w czasie transferu pomiędzy nimi).
Mechanizm używane to:
-lock na aktualizowanych wierszach (podobnie jak przy poziomie read commited)
-MVCC (multi version concurrency control) dla czytania wierszy, będący generalizacją rozwiązania dla zapobiegania dirty readom z poziomu Read Commited
Motto przyświecające Snapshot Isolation: “Readers never block writers, writers never block readers”.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Na czym polega “Lost update” problem? W jaki sposób się przed nim chronić?

A

Problem występuje, gdy dwie transakcje próbują w tym samym czasie zaktualizować wiersz w oparciu o jego aktualną wersję. Klasyczny przykład: inkrementacja pewnej wartości. Jeśli dwie transakcje odczytają początkową wartość X i każda z nich spróbuję nadpisać wiersz wartością X+1, otrzymamy po ich wykonaniu wartość X+1, choć raczej pożądanym wynikiem byłoby X+2. Innymi słowy może wystąpić przy read-modify-write cycle.

Możliwe rozwiązania:
-użycie poziomu izolacji serializable
-implementacja przez datastore atomicznych operacji (zazwyczaj zaimplementowane przez exclusive lock na read (cursor stability), alternatywa jest wykonywanie wszystkich atomowych operacji na jednym wątku)
-zastosowanie mechanizmu select for update
-wykrywanie przez bazę danych lost updateów, które jest możliwe przy snapshot isolation, robi to np. poziom izolacji Repeatable Read w Postgresie, Oracle Serializable i SQL Server Snapshot Isolation

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Co oznacza skrót MVCC? Jak działa ten mechanizm?

A

Multi Version Concurrency Control - mechanizm stosowany przez bazy danych do implementacji poziomu izolacji Snapshot Isolation. Opis algorytmu:
-transakcja przy rozpoczęciu dostaje autoinkrementowalny txid,
-każdy wiersz tworzony przez tą transakcję jest oznaczany jako stworzony z tym txid
-gdy transakcja aktualizuje jakiś wiersz, oznacza go jako usunięty przez swoje txid i tworzy jego nowąwersję oznaczoną jako stworzoną przez to txid
-w momencie rozpoczęcia transakcja pobiera txid wszystkich transakcji, które są w trakcie
-przy czytaniu wartości danego wiersza bierze pod uwagę tylko te jego wersję, które były zacommitowane podczas rozpoczęcia wykonywania tej transakcji

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Jak działa mechanizm “select for update”?

A

W momencie, w którym transakcja wykonuje “select for update” pobiera exclusive locka na wszystkich wierszach zwróconych przez to zapytanie (inne transakcje nie mogą też czytać wartości tych wierszy do momentu zacommitowania lub abortowania).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

W jaki sposób poziom izolacji Read Commited może zostać zaimplementowany z użyciem mechanizmów Snapshot Isolation?

A

Poprzez pobieranie nowego txid (i zaktualizowanej listy transakcji in progress) dla każdego wykonywanego przez siebie zapytania. W ten sposób transakcje, które zcommitowały się pomiędzy jednym a drugim zapytaniem będą widoczne dla tego drugiego.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Na czym polega problem “write skew”? Czym sięróżni od dirty write i lost update? Czym się różni od phantom read?

A

Dirty write i lost update dotyczą sytuacji, w których dwie transakcje próbują nadpisaćwartość w JEDNYM wierszu. Write skew jest bardziej generalnym problemem - dotyczy sytuacji, gdy dwie transakcje odczytują ten sam zestaw wierszy, ale nadpisują/zapisują więcej niż jeden wiersz, prowadząc do sytuacji, w której pewne założenia co do systemu zostają złamane, np. że tylko jeden wiersz może mieć daną wartość kolumny - dwie transakcje mogą równocześnie próbować nadpisać wartość tej kolumny w dwóch różnych wierszach.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Jak działa mechanizm “materializing conflicts”? Kiedy może się przydać? Jakie są jego wady?

A

Wzorzec stosowany, gdy chcemy zapewnić constrainty dotyczące wielu rekordów, ale nie możemy wykonać explicit locka, ponieważ constraint może dotyczyćbraku istnienia wierszy o danej wartości. Przykład: bookowanie salek. Możemy bookować salkę tylko, gdy ta salka nie jest już zabookowana w tym samym terminie. Nie ma na czym wykonaćselect for update, bo opieramy się na założeniu, że query nic nie zwróci. Przy zastosowaniu materializing conflicts baza danych zawierałaby wszystkie możliwe bookowania z jakąś granularnością, np. potencjalne bookowanie każdej salki co 5 minut. Mając takie wiersze jest na czym zmaterializować konflikt i zdobyćlocka.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Z użyciem jakich mechanizmów współczesne bazy danych implementują poziom izolacji “Serializable”?

A

-actual serial execution
-2PL - 2 Phase Locking (większość relacyjnych baz danych)
-Serializable Snapshot Isolation (PostgreSQL)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Jakie są ograniczenia w implementacji poziomu izolacji Serializable poprzez mechanizm Serial Execution?

A

Główne ograniczenie: użycie tylko jednego rdzenia. Jesteśmy ograniczeni przez moc jego moc.
Dodatkowko jedna długotrwające transakcja może skutecznie zablokować pozostałe. Dlatego w implementacjach Actual Serial Execution przyjmuje się założenie, że transakcje nie są interaktywne. Zamiast tego sprowadzają się do wykonania gotowych procedur, do których transakcja na starcie wprowadza wszystkie zmienne. Transakcje te powinny co do założenia być krótkie. Aby były krótkie przyjmuje się założenie, że cały dataset powinien mieścić sięw RAMie (brak koniecznośći czytania z dysku).

Implementacja stosowana w: VoltDB, Redis i Datomic.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Jakie motto przyświeca poziomowi izolacji Snapshot Isolation? Jak to motto ma się do poziomu Serializable?

A

Snapshot isolation: readers never block writers, writers never block readers
Serializable: readerzy i writerzy mogąsię wzajemnie blockować.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

W jaki sposób zaimplementowany jest mechanizm 2PL (2 Phase Locking)? Które bazy danych go implementują?

A

Odczyt wiersza wiąże się z uzyskaniem współdzielonego locka - kilka transakcji może jednocześnie posiadać read locka. Zapis wymaga z kolei pozyskania exclusive locka - żadna inna transakcja nie może w tym czasie posiadać ani read locka ani write locka.

Pozyskane locki zwalniane są dopiero podczas commitowania/abortowania. Stąd “2” w 2PL.

Aby zapobiegać dead lockom, konieczny jest jakiś mechanizm ich wykrywania.

Aby zapobiec write skew, przy 2PL dodatkowo musi zostać zaimplementowany mechanizm predicate locków lub jego odpowiednik.

17
Q

Jaka jest różnica miedzy predicate locks a index-range locks? Gdzie te mechanizmy mogą zostać zastosowane?

A

Index-range lock są uproszczonym przybliżeniem mechanizmu predicate locków. Zamiast stosować lock na predykatach, który wymagałby, aby inne transakcje sprawdzały, czy którykolwiek z ich readów/writeów narusza którykolwiek z predicate lock, lockuje się wiersza na podstawie indeksu. Np. jeśli mamy zapytanie z kilkoma warunkami, lockujemy wszystkie obiekty, który spełniają jeden z tych warunków, który da się wyrazić istniejącym indeksem na bazie. W ten sposób lockujemy większą ilość wierszy niż konieczne, ale jednocześnie sprawdzanie zajętych locków jest łatwiejsze i szybsze.

Używane w 2PL.s

18
Q

Czym różni się pessimistic locking od optimistic locking? W których bazodanowych mechanizmach znajdziemy przykłady implementacji tych dwóch?

A

Pessimistic locking - zabezpieczamy się przed wszystkim, co może pójść źle, czyli w szczególności pozyskujemy locki na wszystkich zaafektowanych wierszach (czekamy aż będzie bezpieczna dla naszej transakcji sytuacja). Realizacja w implementacji Serializable za pomocą 2PL.
Optimistic locking - zakładamy, że wszystko pójdzie okej bez zakładania locków i zamiast tego sprawdzamy przed commitem, czy nie naruszyliśmy jakichś założeń, np. co do naruszenia izolacji Serializable. Realizacja w Serializable za pomocą Serializable Snapshot Isolation.

19
Q

Jak działa algorytm Serializable Snapshot Isolation? Jakie są jego wady i zalety?

A

Opieramy się na zasadach Snapshot Isolation, ale dodatkowo dokonujemy sprawdzeń, czy w międzyczasie zdarzyło się coś, co naruszyłoby gwarancje poziomu izolacji Serializable. W takim przypadku cofamy transakcję. Wykryć musimy dwie sytuacje:
-uncommited write wystąpił przed odczytem (sprawdzamy przed commitem, czy którykolwiek z tych writeów został zacommitowany)
-write wystąpił po odczycie - użycie mechanizmu podobnego do index-range locking, ale bez lockowania. Gdy write jest commitowany, wyciąga z tego index-range locka zaafektowane ready i informuje ich transakcje, żeby zabortowały.

Zalety: średnio szybszy niż 2PL, ale więcej przerwanych transakcji, które trzeba retryować. Latency jest bardziej przewidywalne.
Wady: ale w punkcie wyżej. Nie nadaje się do długich transakcji, które robią ready i write’y, bo istnieje duże prawdopodobieństwo, że będą abortowane. jeśli większość transakcji to tylko odczyty, zazwyczaj będzie ok.

20
Q

Opisz algorytm decyzyjny odpowiadający za decyzję, czy daną wartość odczytać przy poziomie izolacji Snapshot Isolation.

A

Przy rozpoczęciu transakcja otrzymuje własne TXID (autoinkrementowalna wartość).
Przy dodawaniu nowego wiersza zapisujemy TXID, które go stworzyło.
W momencie nadpisania wartości jakiegoś wiersza, tworzymy tak naprawdę jego nową wersję. W starej wersji zapisujemy TXID, które go nadpisało. W nowej wersji zapisujemy TXID jako to, które go stworzyło.

Przy rozpoczęciu transakcja pobiera listę wszystkich TXID, które jeszcze nie były zcommitowane w tym momencie. Przy odczytywaniu danego wiersza, transakcja może mieć wgląd tylko do tych wersji wiersza, które zostały stworzone przez TXID mniejsze od własnego, jednocześnie nie będących na liście pobranej na początku. Transakcja powinna też odfiltrować wszystkie wersje, które zostały nadpisane przez ten sam zestaw transakcji.

Alternatywny opis z książki:
1. Zignoruj wszystkie zapisy transakcji z początkowo pobranej listy.
2. Zignoruj wszystkie zapisy z transakcji o większym TXID.
3. Zignoruj zabortowane transakcje.
4. Możesz korzystać z pozostałych wersji.
Ale w takim przypadku rozumiem, że z pozostałych transakcji trzeba wybrać najnowszą wersję wiersza.