Transakcja
Jest to zbiór operacji na bazie danych, które stanowią pewną całość. Powinny zostać wykonane wszystkie albo żadna z nich. Nie ma mowy o częściowym wykonaniu. Warunki jakie powinny spełniać transakcje są dokładniej opisane w zasadach ACID. Przykładem transakcji może być dokonywanie przelewu bankowego.
W tym kursie przedstawione zostanie działanie transakcji w PostgreSQL. W tym języku transakcje opisane są poprzez trzy frazy:
- BEGIN WORK – rozpoczęcie transakcji.
- COMMIT WORK – wszystkie elementy wchodzące w skład transakcji są kompletne i powinny zostać zatwierdzone. Od tej pory mają być dostępne dla wszystkich jednoczesnych transakcji oraz wszystkich kolejnych.
- ROLLBACK WORK – transakcja ma zostać porzucona, a zmiany przez nią dokonane na bazie danych mają zostać anulowane.
ACID
ACID definiuje warunki jakie transakcja musi spełnić.
- Atomic (niepodzielność) – Transakcja mimo tego, że jest zbiorem działań musi zostać wykonana jako jedna jednostka. Musi odbywać się w jednym momencie i nie może zostać podzielona na podzbiory.
- Consistent (spójność) – System musi być spójny po zakończeniu transakcji.
- Isolatation (odizolowanie) – Każda transakcja musi być wykonywana niezależnie od innych transakcji, które mogą być wykonywane w tym samym czasie.
- Durability (trwałość) – Wykonana transakcja musi zostać utrwalona na stałe.
Zjawiska niepożądane
- brudny odczyt – odczyt wewnątrz transakcji danych, które są zmieniane przez inną transakcję, która nie została zatwierdzona.
- odczyty nie dające się powtórzyć – odczyt zbioru danych, który przy ponownym odczycie tych samych danych daje zupełnie inny rezultat.
- odczyty widmo – występuje, gdy jedna transakcja odczytuje lub aktualizuje tabele, a druga transakcja w tym czasie dodała nowy wiersz, który powinien zostać dodany później, problem podobny do zjawiska poprzedniego.
- utracone aktualizacje – do bazy danych zapisywane są dwie różne aktualizacje i druga zmiana powoduje, że pierwsza zostaje utracona.
Poziomy izolacji
Każdy silnik bazodanowy posiada różne strategie oddziaływania na siebie wielu transakcji. Można je traktować jak synchronizację wątków w Javie.
Wyróżnia się następujące poziomy izolacji transakcji:
- READ UNCOMMITTED – możliwy brudny odczyt, odczyt nie dający się powtórzyć i odczyt widmo. Problemem tutaj jest to, że chcesz wykonać jedną transakcje na jakiś danych, ale te dane w między czasie zostały już uprzednio zmodyfikowane przez inną.
- READ COMMITTED – niemożliwy brudny odczyt, możliwy odczyt niedający się powtórzyć i odczyt widmo. W tym przypadku nie możesz modyfikować danych, na których założona jest już inna transakcja. Jednak wciąż możliwy jest ich odczyt, gdy są one zmieniane przez drugą transakcje, co może prowadzić do braku spójności.
- REPEATABLE READ – niemożliwy brudny odczyt i odczyt niedający się powtórzyć, możliwy odczyt widmo. Domyślny poziom dla większości baz danych. Jest on bardzo podobny do poprzedniej opcji, z tą różnicą, że transakcja odczytuje dane sprzed jej rozpoczęcia, co ułatwia zachowanie spójności.
- SERIALIZABLE – żaden z niepożądanych odczytów nie jest możliwy. W praktyce oznacza to zablokowanie dostępu do całej tabeli. Niemożliwa jest modyfikacja i odczyt aż do momentu zakończenia transakcji.
Linki do dokumentacji PostgreSQL:
https://www.postgresql.org/docs/current/sql-start-transaction.html