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: .NET Framework
.NET
Standard
Transakcja jest zestawem powiązanych zadań, które między innymi kończą się powodzeniem (zatwierdzeniem) lub niepowodzeniem (przerwanie). Transakcja rozproszona to transakcja, która ma wpływ na kilka zasobów. Aby transakcja rozproszona została zatwierdzona, wszyscy uczestnicy muszą zagwarantować, że każda zmiana danych będzie trwała. Zmiany muszą być zachowywane pomimo awarii systemu lub innych nieprzewidzianych zdarzeń. Jeśli nawet jeden uczestnik nie wprowadzi tej gwarancji, cała transakcja zakończy się niepowodzeniem, a wszelkie zmiany danych w zakresie transakcji zostaną wycofane.
Uwaga / Notatka
Aby uzyskać informacje o transakcjach rozproszonych w Azure SQL Database i Azure SQL Managed Instance, zobacz Rozproszone transakcje w chmurowych bazach danych.
Praca z System.Transactions
Na platformie .NET transakcje rozproszone są zarządzane za pośrednictwem interfejsu API w System.Transactions przestrzeni nazw. Interfejs System.Transactions API deleguje obsługę transakcji rozproszonych do monitora transakcji, takiego jak koordynator transakcji rozproszonych firmy Microsoft (MS DTC), gdy zaangażowanych jest wiele trwałych menedżerów zasobów. Aby uzyskać więcej informacji, zobacz Podstawy transakcji.
ADO.NET 2.0 wprowadzono obsługę rejestrowania w transakcji rozproszonej przy użyciu EnlistTransaction metody , która enlistuje połączenie w wystąpieniu Transaction . W poprzednich wersjach ADO.NET dołączanie do transakcji rozproszonych odbywało się poprzez jawne użycie metody EnlistDistributedTransaction w celu dołączenia połączenia do wystąpienia ITransaction, co jest obsługiwane dla zapewnienia zgodności wstecznej. Aby uzyskać więcej informacji na temat transakcji usług Enterprise Services, zobacz Współdziałanie z usługami przedsiębiorstwa i transakcjami COM+.
W przypadku korzystania z transakcji z dostawcą System.Transactions danych Microsoft SqlClient dla programu SQL Server w bazie danych programu SQL Server zostanie automatycznie użyty lekki Transaction . Transakcję można następnie awansować do pełnej transakcji rozproszonej zgodnie z potrzebami. Aby uzyskać więcej informacji, zobacz System.Transactions integration with SQL Server (Integracja transakcji System.Transactions z programem SQL Server).
Automatyczne dołączanie do transakcji rozproszonej
Automatyczna rejestracja jest domyślnym (i preferowanym) sposobem integrowania połączeń ADO.NET z programem System.Transactions. Obiekt połączenia będzie automatycznie zarejestrować się w istniejącej transakcji rozproszonej, jeśli określi, że transakcja jest aktywna, co oznacza System.Transaction , że Transaction.Current nie ma wartości null. Automatyczne rejestrowanie transakcji występuje po otwarciu połączenia. Nie stanie się tak, nawet jeśli polecenie zostanie wykonane wewnątrz zakresu transakcji. Automatyczne rejestrowanie w istniejących transakcjach można wyłączyć, określając Enlist=false jako parametr łańcucha połączenia dla elementu SqlConnection.ConnectionString.
Ręczne przystąpienie do transakcji rozproszonej
Jeśli automatyczne rejestrowanie jest wyłączone lub musisz zarejestrować transakcję, która została uruchomiona po otwarciu połączenia, możesz zarejestrować się w istniejącej transakcji rozproszonej przy użyciu EnlistTransaction metody SqlConnection obiektu microsoft SqlClient Data Provider for SQL Server. Rejestrowanie w istniejącej transakcji rozproszonej gwarantuje, że jeśli transakcja zostanie zatwierdzona lub wycofana, modyfikacje wprowadzone przez kod w źródle danych również zostaną zatwierdzone lub wycofane.
Uwaga / Notatka
Jeśli spróbujesz zatwierdzić lub wycofać transakcję, zostanie zgłoszony wyjątek, jeśli DataReader transakcja zostanie uruchomiona, gdy transakcja jest aktywna.
Rejestrowanie w transakcjach rozproszonych ma szczególne zastosowanie w przypadku łączenia obiektów biznesowych. Jeśli obiekt biznesowy znajduje się w puli z otwartym połączeniem, automatyczne rejestrowanie transakcji odbywa się tylko wtedy, gdy to połączenie jest otwarte. Jeśli wiele transakcji jest wykonywanych przy użyciu obiektu biznesowego w puli, otwarte połączenie dla tego obiektu nie będzie automatycznie zarejestrować się w nowo zainicjowanych transakcjach. W takim przypadku można wyłączyć automatyczne rejestrowanie transakcji dla połączenia i zarejestrować połączenie w transakcjach przy użyciu polecenia EnlistTransaction.
EnlistTransaction przyjmuje jeden argument typu Transaction , który jest odwołaniem do istniejącej transakcji. Po wywołaniu metody połączenia EnlistTransaction wszystkie modyfikacje wprowadzone w źródle danych przy użyciu połączenia są uwzględniane w transakcji. Przekazanie wartości null powoduje wypisanie połączenia z bieżącej transakcji rozproszonej. Należy pamiętać, że połączenie musi zostać otwarte przed wywołaniem metody EnlistTransaction.
Uwaga / Notatka
Gdy połączenie zostanie jawnie przypisane do transakcji, nie może być wycofane ani przypisane do innej transakcji, dopóki pierwsza transakcja się nie zakończy.
Ostrzeżenie
EnlistTransaction zgłasza wyjątek, jeśli połączenie rozpoczęło już transakcję przy użyciu metody połączenia BeginTransaction . Jeśli jednak transakcja jest transakcją lokalną uruchomioną w źródle danych (na przykład wykonanie instrukcji BEGIN TRANSACTION jawnie przy użyciu SqlCommand), EnlistTransaction spowoduje wycofanie transakcji lokalnej i rejestracji w istniejącej transakcji rozproszonej zgodnie z żądaniem. Nie otrzymasz powiadomienia, że transakcja lokalna została wycofana, i musisz zarządzać wszystkimi transakcjami lokalnymi, które nie zostały rozpoczęte z użyciem BeginTransaction. Jeśli używasz dostawcy danych Microsoft SqlClient dla programu SQL Server z programem SQL Server, próba rejestracji zgłosi wyjątek. Wszystkie inne przypadki nie zostaną wykryte.
Transakcje promotable w programie SQL Server
Program SQL Server obsługuje transakcje promotable, w których lokalna uproszczona transakcja może być automatycznie promowana do transakcji rozproszonej tylko wtedy, gdy jest to wymagane. Transakcja promowalna nie powoduje dodatkowego obciążenia związanego z transakcjami rozproszonymi, chyba że dodatkowe obciążenie jest konieczne. Aby uzyskać więcej informacji i przykładowy kod, zobacz System.Transactions integration with SQL Server (Integracja pliku System.Transactions z programem SQL Server).
Konfigurowanie transakcji rozproszonych
Może być konieczne włączenie usługi MS DTC przez sieć w celu korzystania z transakcji rozproszonych. Jeśli lokalna zapora systemu Windows serwera jest włączona, musisz zezwolić usłudze MS DTC na korzystanie z sieci lub otworzyć port MS DTC.