Udostępnij za pośrednictwem


Transakcje rozproszone

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 zatwierdzana, wszyscy uczestnicy muszą zagwarantować, że każda zmiana danych będzie trwała. Zmiany muszą zostać zachowane niezależnie awarie systemu lub inne nieprzewidziane zdarzenia. 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

Jeśli spróbujesz zatwierdzić lub wycofać transakcję, zostanie zgłoszony wyjątek, jeśli DataReader transakcja zostanie uruchomiona, gdy transakcja jest aktywna.

Praca z system.transactions

W programie .NET Framework transakcje rozproszone są zarządzane za pośrednictwem interfejsu System.Transactions API w 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 jawne rejestrowanie w transakcjach rozproszonych zostało wykonane przy użyciu EnlistDistributedTransaction metody połączenia z rejestracją połączenia w wystąpieniu ITransaction , które jest obsługiwane w celu zapewnienia zgodności z poprzednimi wersjami. 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 programu .NET Framework dla programu SQL Server względem bazy danych programu SQL Server zostanie automatycznie użyta uproszczona Transaction wersja. 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).

Uwaga

Maksymalna liczba transakcji rozproszonych, w których baza danych Oracle może uczestniczyć w jednym momencie, jest domyślnie ustawiona na 10. Po 10 transakcji po nawiązaniu połączenia z bazą danych Oracle zgłaszany jest wyjątek. Oracle nie obsługuje DDL transakcji rozproszonej.

Automatyczne rejestrowanie w 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 parametry połączenia dla SqlConnection.ConnectionStringelementu lub OLE DB Services=-7 jako parametr parametry połączenia dla elementu OleDbConnection.ConnectionString. Aby uzyskać więcej informacji na temat parametrów parametry połączenia Oracle i ODBC, zobacz OracleConnection.ConnectionString i OdbcConnection.ConnectionString.

Ręczne rejestrowanie w transakcji rozproszonej

Jeśli automatyczna rejestracja jest wyłączona 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 DbConnection obiektu dla dostawcy, z którym pracujesz. 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.

Rejestrowanie w transakcjach rozproszonych ma szczególne zastosowanie w przypadku buforowania obiektów biznesowych. Jeśli obiekt biznesowy jest w puli z otwartym połączeniem, automatyczne rejestrowanie transakcji odbywa się tylko po otwarciu tego połączenia. 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 wyrejestruje połączenie z bieżącej rejestracji transakcji rozproszonej. Należy pamiętać, że połączenie musi zostać otwarte przed wywołaniem metody EnlistTransaction.

Uwaga

Gdy połączenie zostanie jawnie zarejestrowane w transakcji, nie może być zarejestrowane ani zarejestrowane w innej transakcji, dopóki pierwsza transakcja nie zostanie zakończona.

Uwaga

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 musi zarządzać wszystkimi transakcjami lokalnymi, które nie zaczęły korzystać z usługi BeginTransaction. Jeśli używasz programu .NET Framework Dostawca danych dla programu SQL Server (SqlClient) z programem SQL Server, próba rejestracji zgłosi wyjątek. Wszystkie inne przypadki nie zostaną wykryte.

Transakcje promocyjne 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 promotable nie wywołuje dodatkowego obciążenia transakcji rozproszonej, chyba że dodatkowe obciążenie jest wymagane. Aby uzyskać więcej informacji i przykładowy kod, zobacz System.Transactions Integration with SQL Server (Integracja transakcji 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 zapora systemu Windows jest włączona, musisz zezwolić usłudze MS DTC na korzystanie z sieci lub otworzyć port MS DTC.

Zobacz też