- atomowość (Atomicity) - wszystkie instrukcje muszą być wykonane jako jedna całość, lub też wszystko musi zostać cofnięte do stanu przed wykonywania transakcji
- spójność (Consistency) - po wykonaniu transakcji wszystkie więzy integralności muszą zostać zachowane
- izolacja (Isolation) - w przypadku wykonywania więcej niż jednej transakcji na danych w tym samym czasie, nie powinny one o tym wiedzieć (uzależnione jest to także od poziomu izolacji)
- trwałość (Durability) - zatwierdzone transakcje nie mogą spowodować uszkodzenia danych w przypadku nagłego braku zasilania.
- optymistyczne algorytmy - zakładają brak zakładania blokad podczas dostępu do danych
- pesymistyczne algorytmy - nakładają blokady podczas dostępu do danych
- dirty read - brudne czytanie - transakcja odczytała dane zmienione przez inną nie zatwierdzoną jeszcze transakcję. Problem może się objawić w przypadku, gdy ta nie zatwierdzona transakcja zostanie odwołana.
- nonrepeatable read - występuje gdy jedna transakcja odczytuje te same dane dwukrotnie, a pomiędzy tymi odczytaniami inna transakcja modyfikuje te dane.
- phantom read - podczas wielokrotnych odczytów danych przez jedną transakcję, inne dodają lub usuwają wiersze. W wyniku tego mamy do czynienia z większą bądź mniejszą ilością zwracanych danych po każdym odczycie.
Opis poszczególnych poziomów:
- read uncomitted - brak izolacji
- read committed with locks - poziom domyślny dla MS SQL - nie pozwala odczytywać danych nie zatwierdzonych przez transakcję
- read committed with snapshots - tylko zatwierdzone zmiany są widoczne w transakcji. Trzymana jest wersja wiersza w pamięci i zostanie użyta tymczasowa baza danych. Zaletą jest brak blokad.
- repetable read - tryb najlepszy w przypadku gdy w jednej transakcji chcemy odczytać i zapisać dane. Inne transakcje muszą zaczekać do momentu gdy zakończy działanie transakcja z tym poziomem izolacji
- snapshot - tworzy kopię danych na których będzie pracować transakcja. Istnieje jednak duże prawdopodobieństwo, że podczas zatwierdzania transakcji dojdzie do konfliktu z powodu działania na tych samych danych przez inne transakcje
- serializable - zakłada blokadę na wierszach; nie można dodawać, usuwać ani modyfikować zablokowanych danych aż do momentu zaakceptowania transakcji. Najbardziej restrykcyjny poziom, należy go używać tylko wtedy gdy jest to koniecznie wymagane
Tworzenie transakcji
W MS SQL tworzymy transakcję w następujący sposób:
SET XACT_ABORT ON --powoduje przechwytywanie wszystkich bledów powyzej poziomu 21, czyli fatalnychBEGIN TRY
BEGIN TRANSACTION --rozpoczecie transakcji
--operacje na danych
COMMIT TRANSACTION --zatwierdzenie transakcjiEND TRYBEGIN CATCH
ROLLBACK TRANSACTION --cofniecie zmian wprowadzonych przez transakcje, jezeli zostanie przchwycony wyjatekEND CATCH
W C# tworzymy ją w ten sposób:
Code:
Poziom izolacji w SQLu ustawiamy za pomocą komendy:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
W C# ustawiamy poziom izolacji w metodzie BeginTransaction.
TransactionScope
Klasa ta pozwala w prosty sposób tworzyć bloki transakcyjne dla aplikacji działających z bazą MS SQL.
Kod:
Code:
Kod sporo uproszczony, jednak dostępny tylko dla bazy MS SQL. W przypadku innych baz należy korzystać z wcześniej podanego rozwiązania
Brak komentarzy:
Prześlij komentarz