Transakcje – bezpieczny zapis do bazy danych

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.

try
{
    using (testEntities EF = new testEntities())
    {

        team Team = new team();
        Team.Liga = "NoTs";
        Team.NazwaDruzyny = "NoTs";
        EF.team.Add(Team);
        EF.SaveChanges();

        int b = 0;
        int test = 10 / b;
    }
}
catch (Exception e)
{

}

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:

try
{
    using (TransactionScope scope = new TransactionScope())
    {
        using (testEntities EF = new testEntities())
        {

            team Team = new team();
            Team.Liga = "Ts";
            Team.NazwaDruzyny = "Ts";
            EF.team.Add(Team);
            EF.SaveChanges();

            int b = 0;
            int test = 10 / b;
        }
        scope.Complete();
    }
}
catch (Exception e)
{

}

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.

 

Leave a Reply

Your email address will not be published. Required fields are marked *