Za pomocą System.Transactions
The System.Transactions namespace is new in the Microsoft .NET Framework wersja 2.0. Znajdują się w nim nowe ramy transakcji, która jest w pełni zintegrowany z ADO.NET i SQL Server Integracja (CLR) w czasie wykonywania typowych języka. The System.Transactions.TransactionScope class makes a code blok transactional by implicitly enlisting connections in a transakcja rozproszona. Należy wywołać Complete Metoda na końcu blok kodu oznaczona przez TransactionScope. The Dispose metoda is invoked when program execution leaves a code blok, causing the transaction to be discontinued if the Complete metoda is not called. Jeśli ma zostać wyjątek powodujący, że kod, aby pozostawić zakres, transakcja jest uważana za być wstrzymana.
Zaleca się, że korzystają using blok, aby upewnić się, że Dispose wywoływana jest metoda TransactionScope obiekt po using blok jest zakończony. Niemożność zatwierdzanie lub rolki ponownie do czas transakcji może poważnie obniżyć wydajność, ponieważ domyślny limit czas dla TransactionScope to jedną minutę. Jeśli nie używasz using instrukcja, należy wykonać wszystkie prace w Try Blokowanie i jawnie wywołać Dispose Metoda Finally blok.
Jeśli wystąpi wyjątek w ramach TransactionScope, transakcja jest oznaczony jako niespójne i zostanie zaniechana. To jest wycofywany po z powrotem TransactionScope jest możliwe. Jeśli wystąpi nie wyjątku, Przekaż uczestniczących transakcji.
TransactionScope należy używać tylko wtedy, gdy jest uzyskiwany źródeł danych lokalnych i zdalnych lub menedżerów zasób zewnętrznych.Dzieje się tak, ponieważ TransactionScope zawsze powoduje transakcji rozwijać, nawet wtedy, gdy jest on używany tylko w ramach połączenia kontekstu.
Uwaga
The TransactionScope class creates a transaction with a System.Transactions.Transaction.IsolationLevel of Serializable by default.W zależności od aplikacji można zmniejszyć poziom izolacji, aby uniknąć wysokiego rywalizacji w aplikacji należy wziąć pod uwagę.
Uwaga
Firma Microsoft zaleca wykonanie tylko aktualizacje, wstawia, i usuwa w rozłożone transakcje zdalnych serwerów, ponieważ zajmują one zasoby znaczące bazy danych.Jeśli operacja ma być wykonana na serwerze lokalnym, transakcja rozproszona nie jest konieczne i wystarczy transakcji lokalnej.Instrukcje SELECT może niepotrzebnie blokada zasobów bazy danych, a w niektórych sytuacjach może być konieczne użycie transakcji dla operacji wyboru.Należy wykonać żadnej pracy innych niż bazy danych poza zakres transakcji, o ile nie obejmuje innych menedżerów zasób transakcji.Mimo, że wyjątek w zakresie transakcji uniemożliwia transakcji z zatwierdzeniem, TransactionScope Klasa zawiera nie na wycofywanie zmian kodu dokonał poza zakresem samej transakcji. Jeśli trzeba podjąć inną akcja, gdy transakcja jest cofana, należy napisać własny wykonania System.Transactions.IEnlistmentNotification interfejs i zarejestrować transakcji, jawnie.
Przykład
Aby pracować z System.Transactions, musisz mieć odwołanie do pliku System.Transactions.dll.
Poniższy kod demonstruje sposób tworzenia transakcji, które mogą być wyznaczane przed dwa różne wystąpienia SQL Server. Te wystąpienia są reprezentowane przez dwóch różnych System.Data.SqlClient.SqlConnection obiekty, które są pakowane w TransactionScope blok. Kod tworzy TransactionScope blokowanie z using Instrukcja i powoduje otwarcie pierwszego połączenia automatycznie rejestruje w TransactionScope. Transakcja jest początkowo zarejestrowana jako transakcja lekki, nie pełnego transakcja rozproszona.Kod zakłada się istnienie warunkowego logiki (która została pominięta dla Zwięzłość).Otwiera drugie połączenie tylko wtedy, gdy jest potrzebna, rejestrowanie w TransactionScope. Po otwarciu połączenia transakcji jest automatycznie podwyższony do pełnego transakcja rozproszona.Kod jest następnie wywołuje. TransactionScope.Complete, który zatwierdza transakcję. Kod usuwa dwa połączenia podczas zamykania using instrukcje dla połączeń. The TransactionScope.Dispose metoda for the TransactionScope is automatically called at the termination of the using blok for the TransactionScope. Jeśli ma zostać wyjątek w dowolnym miejscu TransactionScope blok, Complete nie uzyskać wywołana, i transakcja rozproszona zostanie z powrotem po TransactionScope jest możliwe.
Visual Basic
Using transScope As New TransactionScope()
Using connection1 As New SqlConnection(connectString1)
' Opening connection1 automatically enlists it in the
' TransactionScope as a lightweight transaction.
connection1.Open()
' Do work in the first connection.
' Assumes conditional logic in place where the second
' connection will only be opened as needed.
Using connection2 As New SqlConnection(connectString2)
' Open the second connection, which enlists the
' second connection and promotes the transaction to
' a full distributed transaction.
connection2.Open()
' Do work in the second connection.
End Using
End Using
' Commit the transaction.
transScope.Complete()
End Using
C#
using (TransactionScope transScope = new TransactionScope())
{
using (SqlConnection connection1 = new
SqlConnection(connectString1))
{
// Opening connection1 automatically enlists it in the
// TransactionScope as a lightweight transaction.
connection1.Open();
// Do work in the first connection.
// Assumes conditional logic in place where the second
// connection will only be opened as needed.
using (SqlConnection connection2 = new
SqlConnection(connectString2))
{
// Open the second connection, which enlists the
// second connection and promotes the transaction to
// a full distributed transaction.
connection2.Open();
// Do work in the second connection.
}
}
// The Complete method commits the transaction.
transScope.Complete();
}