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.


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

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.

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.
