Transakcja
Transakcja jest zbiorem operacji na bazie danych, które wykonują się zgodnie z zasadą “wszystko albo nic”. Transakcyjność gwarantuje spójność danych w przypadku wystąpienia błędu w trakcie wykonania zapytania na bazie danych. Jest ona jedną z zasad ACID
Zasada ACID
Atomicity – atomowość, Consistency – spójność, Isolation – izolacja, Durability – trwałość.
- atomowość transakcji oznacza, iż każda transakcja albo wykona się w całości, albo w ogóle, czyli np. jeżeli w ramach jednej transakcji odbywać ma się przelew bankowy (zmniejszenie wartości jednego konta i powiększenie innego o tę samą kwotę), to nie może zajść sytuacja, że z jednego konta ubędzie pieniędzy a kwota na docelowym będzie bez zmian: albo przelew zostanie wykonany w całości, albo w ogóle.
- spójność transakcji oznacza, że po wykonaniu transakcji system będzie spójny, czyli nie zostaną naruszone żadne zasady integralności.
- trwałość danych oznacza, że system potrafi uruchomić się i udostępnić spójne, nienaruszone i aktualne dane zapisane w ramach zatwierdzonych transakcji, na przykład po nagłej awarii zasilania.
- izolacja transakcji oznacza, iż jeżeli dwie transakcje wykonują się współbieżnie, to zazwyczaj (zależnie od poziomu izolacji) nie widzą zmian przez siebie wprowadzanych. Poziom izolacji w bazach danych jest zazwyczaj konfigurowalny i określa, jakich anomalii możemy się spodziewać przy wykonywaniu transakcji. Przykładowe typy izolacji to (model ANSI):
- read uncommitted – najniższy poziom izolacji, jedna transakcja może odczytywać wiersze, na których działają inne transakcje,
- read committed – transakcja może odczytywać tylko wiersze zapisane,
- repeatable read – transakcja nie może czytać, ani zapisywać, na wierszach odczytywanych, bądź zapisywanych w innej transakcji,
- serializable – pełna izolacja, wyniki współbieżnie realizowanych zapytań muszą być identyczne z wynikami tych samych zapytań realizowanych szeregowo (ang. nazwa oznacza szeregowalne)
(źródło: wikipedia)
Poziomy izolacji w MS Sql Server
Read uncommited – jest to najmniej restrykcyjne ustawienie, które praktycznie powoduje ignorowanie założonych blokad. Jeżeli jedna transakcja nie została zatwierdzona (commit) ale zmieniła dane w bazie to w tym samym czasie inny proces może te dane odczytać. Jeżeli wspomniana transakcja zostanie wycofana to w efekcie okaże się, że drugi proces pobrał dane, które zostały wycofane.
Read commited – jest to domyślna opcja, która powoduje, że we wspomnianym przykładzie zostaną odczytane dane sprzed rozpoczęcia pierwszej transakcji. Podstawową wadą tej opcji jest oczywiście odwrotna sytuacja niż poprzednio – w momencie zatwierdzenia transakcji dane zostaną zmienione czyli nasz pierwotny odczyt będzie nieaktualny.
Repeatable read – w tym przypadku odczytywane są jedynie dane z zatwierdzonych transakcji, a żadna z transakcji nie może zmodyfikować danych, które zostały odczytane
Snapshot – w tym przypadku każda transakcja w momencie jej utworzenia tworzy sobie snapshot danych i na nim pracuje do czasu jej zakończenia. W ten sposób inne transakcje nie są w stanie zmodyfikować danych, które zostały użyte. Nawet jeżeli inna transakcja zmodyfikuje dane to oryginalna transakcja cały czas pracuje na danych z momentu jej utworzenia. W ten sposób upraszczamy dostęp do danych ale powoduje to dodatkowe obciążenie tabeli tempdb.
Serializable – odczyt danych z tabeli za pośrednictwem instrukcji select powoduje zablokowanie danego zakresu. W efekcie żadna inna transakcja nie będzie miała możliwości zmiany danych w tym okresie.