Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Przestrzeń nazw System.Transactions zapewnia strukturę transakcji, która jest w pełni zintegrowana z ADO.NET i integracją środowiska uruchomieniowego języka wspólnego programu SQL Server (CLR). Klasa System.Transactions.TransactionScope tworzy blok kodu transakcyjny niejawnie rejestrując połączenia w transakcji rozproszonej. Należy wywołać metodę Complete na końcu bloku kodu oznaczonego przez TransactionScope. Metoda Dispose jest wywoływana, gdy wykonywanie programu opuszcza blok kodu, co powoduje, że transakcja zostanie przerwana, jeśli metoda Complete nie zostanie wywołana. Jeśli zgłoszono wyjątek, który powoduje opuszczenie zakresu przez kod, transakcja jest uważana za zakończoną.
Zalecamy zastosowanie bloku using, aby upewnić się, że metoda Dispose jest wywoływana w obiekcie TransactionScope po zakończeniu bloku using. Niepowodzenie zatwierdzania lub wycofywania oczekujących transakcji może poważnie obniżyć wydajność, ponieważ domyślny limit czasu dla TransactionScope wynosi minutę. Jeśli nie używasz instrukcji using, musisz wykonać całą pracę w bloku Try i jawnie wywołać metodę Dispose w bloku Finally.
Jeśli w TransactionScopewystąpi wyjątek, transakcja jest oznaczona jako niespójna i zostaje porzucona. Cofa się po usunięciu TransactionScope. Jeśli nie wystąpi wyjątek, zatwierdzanie uczestniczących transakcji.
TransactionScope należy używać tylko wtedy, gdy są dostępne lokalne i zdalne źródła danych lub menedżerowie zasobów zewnętrznych, ponieważ TransactionScope zawsze powoduje podwyższenie poziomu transakcji, nawet jeśli są używane tylko w ramach połączenia kontekstowego.
Klasa TransactionScope domyślnie tworzy transakcję z System.Transactions.Transaction.IsolationLevelSerializable. W zależności od aplikacji warto rozważyć obniżenie poziomu izolacji, aby uniknąć wysokiej rywalizacji w aplikacji.
Nuta
Zalecamy wykonywanie tylko aktualizacji, wstawiania i usuwania w ramach transakcji rozproszonych na serwerach zdalnych, ponieważ zużywają one znaczne zasoby bazy danych. Jeśli operacja zostanie wykonana na serwerze lokalnym, transakcja rozproszona nie jest konieczna, a transakcja lokalna wystarczy.
SELECT instrukcje mogą niepotrzebnie blokować zasoby bazy danych, a w niektórych scenariuszach może być konieczne użycie transakcji do wyboru. Każda praca niezwiązana z bazą danych powinna odbywać się poza zakresem transakcji, chyba że obejmuje ona innych transakcyjnych menedżerów zasobów.
Mimo że wyjątek w zakresie transakcji uniemożliwia zatwierdzanie transakcji, klasa TransactionScope nie ma aprowizacji wycofywania żadnych zmian, które kod wprowadza poza zakresem samej transakcji. Jeśli musisz podjąć jakąś akcję, gdy transakcja zostanie wycofana, musisz napisać własną implementację interfejsu System.Transactions.IEnlistmentNotification i jawnie zarejestrować się w transakcji.
Przykłady
Aby pracować z System.Transactions, musisz mieć odwołanie do pliku System.Transactions.dll.
Poniższy kod pokazuje, jak utworzyć transakcję, która może być promowana względem dwóch różnych wystąpień programu SQL Server. Te wystąpienia są reprezentowane przez dwa różne obiekty System.Data.SqlClient.SqlConnection, które są opakowane w blok TransactionScope. Kod tworzy blok TransactionScope z instrukcją using i otwiera pierwsze połączenie, które automatycznie zapisuje go w TransactionScope. Transakcja jest początkowo wymieniona jako uproszczona transakcja, a nie pełna transakcja rozproszona. Kod zakłada istnienie logiki warunkowej (pominięto w celu zwięzłości). Spowoduje to otwarcie drugiego połączenia tylko wtedy, gdy jest potrzebne, wyjęcie go w TransactionScope.
Po otwarciu połączenia transakcja jest automatycznie promowana do pełnej transakcji rozproszonej. Następnie kod wywołuje TransactionScope.Complete, który zatwierdza transakcję. Kod usuwa dwa połączenia podczas zamykania instrukcji using dla połączeń. Metoda TransactionScope.Dispose dla TransactionScope jest automatycznie wywoływana po zakończeniu bloku using dla TransactionScope. Jeśli w jakimkolwiek momencie bloku TransactionScope zgłoszono wyjątek, Complete nie zostanie wywołany, a transakcja rozproszona zostanie wycofana po usunięciu TransactionScope.
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();
}