Transakcje – bezpieczny zapis do bazy danych

dobra_transakcja

Transakcje

Transakcja jest zakresem w którym znajdują się polecenia związane z operacjami na bazie danych. Jeżeli operacje są wykonane prawidłowo to zostaną zapisane – w przeciwnym wypadku polecenia zostają cofnięte. Najlepiej będzie jeżeli zobaczymy taką transakcję na przykładzie.

Zdarzyło Ci się kiedyś, że zapisywałeś jakieś informacje do bazy danych lecz wystąpił błąd w kodzie lub informacja, że warunek nie został wykonany i chciałbyś cofnąć zmiany?

Nic prostszego! Wystarczy użyć transakcji i klasy TransationScope.

Najlepiej taką transakcję napisać w bloku using aby później nie zapomnieć jej usunąć. Klasa ta posiada metodę Complete(), która odpowiada za zatwierdzenie wszystkich operacji zawartych między obiektem klasy TransationScope , a metodą Complete().

 

TransactionScope

Zobaczmy to na przykładzie klasy, która będzie posiadała blok try-catch, tj. jeżeli w kodzie umieszczonym w bloku try wystąpi jakiś błąd/wyjątek to blok catch go złapie a nasz program się „nie wysypie”.

Dodajemy zatem referencje do transakcji w naszym programie przez kliknięcie prawego przycisku na References w oknie Solution Explorer i Add Reference, a następnie szukamy System.Transactions. Od tej pory możemy korzystać z przestrzeni nazw using System.Transactions z której to możemy utworzyć obiekt klasy TransationScope.

Screenshot_4

Screenshot_3

Skorzystamy z tabeli „team” której dane przedstawiają się następująco.

Screenshot_1

Napiszemy teraz klasę, która dodaje nowy rekord do tabeli „team” z informacją o nazwie ligi i drużyny po której  zapiszemy zmiany do bazy danych przy pomocy metody Entity Framework – SaveChanges().
Następnie specjalnie wywołamy błąd przy którym będziemy dzielić przez zero.

Po uruchomieniu tego kodu wystąpił błąd ponieważ dzieliliśmy przez zero i złapaliśmy wyjątek ale jak możemy zauważyć – dane zostały zapisane w bazie danych.

Screenshot_2

Co zrobić jeżeli chcemy aby zapisane lub edytowane dane zostały cofnięte po wystąpieniu błędu? Tworzymy w kodzie obiekt z klasy TransationScope i umieszczamy metodę  Complete() w miejscu w którym chcemy sprawdzić czy wszystko przebiegło należycie.

Kod wygląda następująco:

Po uruchomieniu programu pojawił się błąd po metodzie SaveChanges o dzieleniu przez zero tak samo jak w pierwszym kodzie ale widzimy tutaj różnice. Nowe informacje nie zostały zapisane do bazy danych. Dzieje się tak ponieważ po wykonaniu operacji w bloku using z TransationScope nie napotykamy na metodę Complete(), która zatwierdza nam nasze operacje, a po wystąpieniu błędu „przeskoczyliśmy” do bloku catch.


Transakcje to bardzo szeroki temat. Omówiłem tutaj jedynie prosty przykład w oparciu o klasę TranastionScope.

Więcej informacji na temat transakcji ładnie i konkretnie opisanej znajdziemy TUTAJ.

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *