Sdílet prostřednictvím


Distribuované transakce

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

Transakce je sada souvisejících úkolů, které buď uspějí (commit) nebo selžou (abort) jako jednotka. 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 se musí zachovat i přes chybové ukončení 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:

Pro informace o distribuovaných transakcích v Azure SQL Database a Azure SQL Managed Instance viz Distribuované transakce napříč cloudovými databázemi.

Práce se System.Transactions

V .NET 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í na monitor transakcí, jako je například Microsoft Distributed Transaction Coordinator (MS DTC), když je zapojeno více vytrvalých správců prostředků. Další informace naleznete v tématu Základy transakcí.

ADO.NET 2.0 zavedla podporu pro zařazení do distribuované transakce pomocí metody EnlistTransaction, která zapíše připojení do instance Transaction. V předchozích verzích ADO.NET se explicitní zapojení do distribuovaných transakcí provádělo pomocí metody EnlistDistributedTransaction pro zapojení připojení do instance ITransaction, 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 dat Microsoft SqlClient pro SQL Server s databází SQL Serveru se automaticky použije 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.

Automatické zařazení do distribuované transakce

Automatické zařazování 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í v existujících transakcích můžete zakázat zadáním Enlist=false jako parametru připojovacího řetězce pro SqlConnection.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 se zařadit do existující distribuované transakce pomocí metody objektu EnlistTransaction knihovny SqlConnection Microsoft SqlClient Data Provider pro SQL Server. 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.

Poznámka:

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

Zapojení do distribuovaných transakcí je obzvláště vhodné při sdružování obchodních objektů. Pokud je obchodní objekt ve fondu s otevřeným připojením, k automatickému zařazení transakce dochází 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 zapojit 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 odpojí připojení z jeho aktuálního zapojení do distribuované transakce. 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í a je spuštěna ve zdroji dat (například spuštěním příkazu SqlCommand BEGIN TRANSACTION explicitně), EnlistTransaction zpětně vrátí místní transakci a připojí se k existující distribuované transakci podle požadavku. Nebudete dostávat oznámení, že místní transakce byla vrácena zpět; musíte spravovat všechny místní transakce, které nebyly zahájeny pomocí BeginTransaction. Pokud používáte zprostředkovatele dat Microsoft SqlClient pro SQL Server, pokus o zařazení do transakce vyvolá výjimku. Všechny ostatní případy zůstanou nezjištěné.

Propagovatelné transakce v SQL Serveru

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 místní brána Windows Firewall serveru povolená, musíte službě MS DTC povolit, aby používala síť nebo otevřela port MS DTC.

Viz také