Istnieją 2 główne rodzaje transakcji; transakcje połączeń i transakcje otoczenia. Transakcja połączenia (taka jak SqlTransaction) jest powiązana bezpośrednio z połączeniem db (takim jak SqlConnection), co oznacza, że musisz nadal przekazywać połączenie - w niektórych przypadkach OK, ale nie pozwala na „tworzenie / używanie / zwalnianie” użycia i nie zezwala na pracę między bazami danych. Przykład (sformatowany dla spacji):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Nie jest zbyt niechlujny, ale ogranicza się do naszego połączenia "Conn". Jeśli chcemy odwołać się do różnych metod, musimy teraz przekazać „conn”.
Alternatywą jest transakcja otoczenia; Nowość w .NET 2.0, obiekt TransactionScope (System.Transactions.dll) umożliwia korzystanie z szeregu operacji (odpowiedni dostawcy będą automatycznie rejestrować się w transakcjach otoczenia). Ułatwia to retro dopasowanie do istniejącego (nietransakcyjnego) kodu i rozmowę z wieloma dostawcami (chociaż DTC zaangażuje się, jeśli porozmawiasz z więcej niż jednym).
Na przykład:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Zauważ tutaj, że te dwie metody mogą obsługiwać własne połączenia (otwórz / użyj / zamknij / usuń), ale po cichu staną się częścią transakcji otoczenia bez konieczności przekazywania czegokolwiek.
Jeśli twój kod zawiera błędy, Dispose () zostanie wywołana bez Complete (), więc zostanie wycofana. Obsługiwane jest oczekiwane zagnieżdżanie itp., Chociaż nie można cofnąć transakcji wewnętrznej, ale zakończyć transakcję zewnętrzną: jeśli ktoś jest niezadowolony, transakcja jest przerywana.
Inną zaletą TransactionScope jest to, że nie jest on powiązany tylko z bazami danych; każdy dostawca obsługujący transakcje może z niego korzystać. Na przykład WCF. Lub istnieją nawet modele obiektów kompatybilne z TransactionScope (np. Klasy .NET z możliwością wycofania - być może łatwiejsze niż pamiątka, chociaż sam nigdy nie korzystałem z tego podejścia).
W sumie bardzo, bardzo przydatny obiekt.
Kilka zastrzeżeń:
- W SQL Server 2000 TransactionScope natychmiast przejdzie do usługi DTC; jest to naprawione w SQL Server 2005 i nowszych, może używać LTM (znacznie mniej narzutu), dopóki nie porozmawiasz z 2 źródłami itp., kiedy zostanie podniesiony do DTC.
- Wystąpiła usterka, która oznacza, że może być konieczne dostosowanie parametrów połączenia