poniedziałek, 21 stycznia 2013

70-516 Transakcje

Transakcja to zbiór poleceń, które powinny być wykonane jako pojedyncza operacja, lub w przypadku błędu - wycofane w całości. Transakcja posiada cztery cechy tzw. ACID
  • 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.
W przypadku jednoczesnego dostępu do danych, mamy do czynienia z przypadkiem optymistycznym i pesymistycznym dostępu:
  • optymistyczne algorytmy - zakładają brak zakładania blokad podczas dostępu do danych
  • pesymistyczne algorytmy - nakładają blokady podczas dostępu do danych
W wielu aplikacjach kompletna izolacja danych nie ma sensu. Z jednej strony zapewnia ona maksymalny poziom bezpieczeństwa, z drugiej powoduje nie potrzebne przestoje. Jeżeli zmniejszymy jej poziom może dojść do anomalii. Rodzaje anomalii:
  • 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.
Poziomy izolacji w MS SQL



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:
            using (var connection = new SqlConnection(connectionStringSettings.ConnectionString))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        using (var command = connection.CreateCommand())
                        {
                            command.Transaction = transaction;
                            //Operacje
                        }
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        Console.WriteLine(ex.Message);
                    }
                }
            }


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:
            using (var transaction = new TransactionScope())
            {
                using (var connection = new SqlConnection(connectionStringSettings.ConnectionString))
                {
                    connection.Open();
                    using (var command = connection.CreateCommand())
                    {
                        //Operacje
                    }
                    transaction.Complete();
                }
            }

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