Sdílet prostřednictvím


Distribuované transakce

Transakce je sada souvisejících úkolů, které jsou úspěšné (potvrzení) nebo selhání (přerušení) jako jednotka, mimo jiné. Distribuovaná transakce je transakce , která ovlivňuje několik prostředků. Aby distribuovaná transakce byla potvrzena, musí všichni účastníci zaručit, že jakákoli změna dat bude trvalá. Změny musíte zachovat navzdory zhroucení systému nebo jiné nepředvídatelné události. Pokud se i jeden účastník nepodaří tuto záruku provést, celá transakce selže a všechny změny dat v rozsahu transakce se vrátí zpět.

Poznámka:

Výjimka bude vyvolán, pokud se pokusíte potvrdit nebo vrátit transakci, pokud DataReader je spuštěna, zatímco transakce je aktivní.

Práce se System.Transactions

V rozhraní .NET Framework se distribuované transakce spravují prostřednictvím rozhraní API v System.Transactions oboru názvů. Rozhraní System.Transactions API deleguje zpracování distribuovaných transakcí do monitorování transakcí, jako je například koordinátor distribuovaných transakcí (MS DTC), pokud je zapojeno více trvalých správců prostředků. Další informace naleznete v tématu Základy transakcí.

ADO.NET 2.0 zavedla podporu zařazení do distribuované transakce pomocí EnlistTransaction metody, která zapsal připojení v Transaction instanci. V předchozích verzích ADO.NET se explicitní zařazení do distribuovaných transakcí provedlo pomocí EnlistDistributedTransaction metody připojení k zařazení připojení v ITransaction instanci, což je podporováno pro zpětnou kompatibilitu. Další informace o transakcích enterprise services naleznete v tématu Interoperabilita s podnikovými službami a transakcemi modelu COM+.

Při použití System.Transactions transakce se zprostředkovatelem rozhraní .NET Framework pro SQL Server pro databázi SQL Serveru se bude automaticky používat odlehčený Transaction . Transakce se pak dá zvýšit na úplnou distribuovanou transakci podle potřeby. Další informace naleznete v tématu System.Transactions Integrace s SQL Serverem.

Poznámka:

Maximální počet distribuovaných transakcí, které se databáze Oracle může účastnit najednou, je ve výchozím nastavení nastaven na 10. Po 10. transakci při připojení k databázi Oracle je vyvolán výjimka. Oracle nepodporuje DDL uvnitř distribuované transakce.

Automatické zařazení do distribuované transakce

Automatický zařazení je výchozí (a upřednostňovaný) způsob integrace ADO.NET připojení s System.Transactions. Objekt připojení se automaticky zapíše do existující distribuované transakce, pokud zjistí, že transakce je aktivní, což System.Transaction znamená, že Transaction.Current není null. Při otevření připojení dojde k automatickému zařazení transakce. Nestane se poté, i když se příkaz spustí uvnitř oboru transakce. Automatické zařazení můžete zakázat v existujících transakcích zadáním Enlist=false parametru připojovací řetězec pro parametr SqlConnection.ConnectionString, nebo OLE DB Services=-7 jako připojovací řetězec parametr pro .OleDbConnection.ConnectionString Další informace o parametrech Oracle a ODBC připojovací řetězec naleznete OracleConnection.ConnectionString a OdbcConnection.ConnectionString.

Ruční zařazení do distribuované transakce

Pokud je automatické zařazení zakázáno nebo potřebujete přidat transakci, která byla spuštěna po otevření připojení, můžete zařazení do existující distribuované transakce pomocí EnlistTransaction metody objektu DbConnection pro zprostředkovatele, se kterým pracujete. Zařazení do existující distribuované transakce zajišťuje, že pokud je transakce potvrzena nebo vrácena zpět, změny provedené kódem ve zdroji dat budou potvrzeny nebo vráceny zpět.

Zařazení v distribuovaných transakcích se vztahuje zejména při sdružování obchodních objektů. Pokud je obchodní objekt ve fondu s otevřeným připojením, automatická transakce zařazení pouze při otevření tohoto připojení. Pokud se pomocí fondu obchodního objektu provádí více transakcí, otevřené připojení pro tento objekt se automaticky nezařadí do nově zahájených transakcí. V tomto případě můžete zakázat automatické zařazení transakce pro připojení a zařazení připojení do transakcí pomocí EnlistTransaction.

EnlistTransaction přebírá jeden argument typu Transaction , který je odkazem na existující transakci. Po volání metody připojení EnlistTransaction jsou všechny změny provedené ve zdroji dat pomocí připojení zahrnuty do transakce. Předání hodnoty null unenlists připojení z jeho aktuální distribuované transakce zařazení. Upozorňujeme, že připojení musí být otevřeno před voláním EnlistTransaction.

Poznámka:

Jakmile je připojení explicitně zařazeno do transakce, nelze jej zrušit nebo zahrnout do jiné transakce, dokud první transakce nedokončí.

Upozornění

EnlistTransaction vyvolá výjimku, pokud připojení již zahájilo transakci pomocí metody připojení BeginTransaction . Pokud je však transakce místní transakce spuštěna ve zdroji dat (například spuštění příkazu BEGIN TRANSACTION explicitně SqlCommandpomocí ), EnlistTransaction vrátí zpět místní transakci a zařazení do existující distribuované transakce podle požadavku. Nebudete dostávat oznámení, že místní transakce byla vrácena zpět a musí spravovat všechny místní transakce nezačíná používat BeginTransaction. Pokud používáte rozhraní .NET Framework Zprostředkovatel dat pro SQL Server (SqlClient) s SQL Serverem, vyvolá pokus o zařazení výjimku. Všechny ostatní případy nebudou nezjištěné.

Promotable Transactions in SQL Server

SQL Server podporuje propagační transakce, ve kterých lze místní odlehčenou transakci automaticky zvýšit na distribuovanou transakci pouze v případě, že je vyžadována. Propagační transakce nevyvolává přidanou režii distribuované transakce, pokud není vyžadována přidaná režie. Další informace a ukázku kódu naleznete v tématu System.Transactions Integrace s SQL Serverem.

Konfigurace distribuovaných transakcí

Možná budete muset povolit MS DTC přes síť, aby bylo možné používat distribuované transakce. Pokud je povolená brána Windows Firewall, musíte službě MS DTC povolit, aby používala síť nebo otevřela port MS DTC.

Viz také