Dela via


Distribuerade transaktioner

En transaktion är en uppsättning relaterade uppgifter som antingen lyckas (checka in) eller misslyckas (avbryts) som en enhet, bland annat. En distribuerad transaktion är en transaktion som påverkar flera resurser. För att en distribuerad transaktion ska kunna genomföras måste alla deltagare garantera att alla ändringar av data blir permanenta. Ändringarna måste bevaras trots systemkrascher eller andra oförutsedda händelser. Om inte ens en enskild deltagare kan garantera detta misslyckas hela transaktionen och eventuella ändringar av data inom transaktionens omfång återställs.

Kommentar

Ett undantag utlöses om du försöker checka in eller återställa en transaktion om en DataReader startas medan transaktionen är aktiv.

Arbeta med System.Transactions

I .NET Framework hanteras distribuerade transaktioner via API:et System.Transactions i namnområdet. API:et System.Transactions delegerar distribuerad transaktionshantering till en transaktionsövervakare, till exempel Microsoft Distributed Transaction Coordinator (MS DTC) när flera beständiga resurshanterare är inblandade. Mer information finns i Grunderna för transaktioner.

ADO.NET 2.0 introducerade stöd för registrering i en distribuerad transaktion med hjälp av EnlistTransaction metoden, som registrerar en anslutning i en Transaction instans. I tidigare versioner av ADO.NET utfördes explicit registrering i distribuerade transaktioner med hjälp EnlistDistributedTransaction av metoden för en anslutning för att registrera en anslutning i en ITransaction instans, vilket stöds för bakåtkompatibilitet. Mer information om Enterprise Services-transaktioner finns i Samverkan med Enterprise Services och COM+-transaktioner.

När du använder en System.Transactions transaktion med .NET Framework-providern för SQL Server mot en SQL Server-databas, används en lättviktare Transaction automatiskt. Transaktionen kan sedan höjas upp till en fullständig distribuerad transaktion efter behov. Mer information finns i System.Transactions-integrering med SQL Server.

Kommentar

Det maximala antalet distribuerade transaktioner som en Oracle-databas kan delta i samtidigt är inställt på 10 som standard. Efter den tionde transaktionen när den är ansluten till en Oracle-databas utlöses ett undantag. Oracle har inte stöd DDL för en distribuerad transaktion.

Registrera automatiskt i en distribuerad transaktion

Automatisk registrering är standardsättet (och det bästa) sättet att integrera ADO.NET anslutningar med System.Transactions. Ett anslutningsobjekt registreras automatiskt i en befintlig distribuerad transaktion om det fastställer att en transaktion är aktiv, vilket i System.Transaction termer innebär att den Transaction.Current inte är null. Automatisk transaktionsregistrering sker när anslutningen öppnas. Det sker inte efter det även om ett kommando körs i ett transaktionsomfång. Du kan inaktivera automatisk registrering i befintliga transaktioner genom att Enlist=false ange som en anslutningssträng parameter för en SqlConnection.ConnectionString, eller OLE DB Services=-7 som en anslutningssträng parameter för en OleDbConnection.ConnectionString. Mer information om Oracle- och ODBC-anslutningssträng parametrar finns i OracleConnection.ConnectionString och OdbcConnection.ConnectionString.

Registrera manuellt i en distribuerad transaktion

Om automatisk registrering är inaktiverad eller om du behöver registrera en transaktion som startades efter att anslutningen öppnades kan du registrera en befintlig distribuerad transaktion med hjälp EnlistTransaction av DbConnection -metoden för objektet för den provider som du arbetar med. Om du registrerar en befintlig distribuerad transaktion ser du till att ändringar som görs av koden i datakällan även checkas in eller återställs om transaktionen checkas in eller återställs.

Registrering i distribuerade transaktioner är särskilt tillämpligt vid poolning av affärsobjekt. Om ett affärsobjekt poolas med en öppen anslutning sker automatisk transaktionsregistrering endast när anslutningen öppnas. Om flera transaktioner utförs med hjälp av det poolade affärsobjektet, kommer den öppna anslutningen för objektet inte automatiskt att registreras i nyligen initierade transaktioner. I det här fallet kan du inaktivera automatisk transaktionsregistrering för anslutningen och registrera anslutningen i transaktioner med hjälp av EnlistTransaction.

EnlistTransaction tar ett enda argument av typen Transaction som är en referens till den befintliga transaktionen. När du har anropat anslutningens -metod inkluderas EnlistTransaction alla ändringar som görs i datakällan med hjälp av anslutningen i transaktionen. Om du skickar ett null-värde avlistas anslutningen från den aktuella distribuerade transaktionslistan. Observera att anslutningen måste öppnas innan du anropar EnlistTransaction.

Kommentar

När en anslutning uttryckligen har registrerats för en transaktion kan den inte tas bort eller tas med i en annan transaktion förrän den första transaktionen har slutförts.

Varning

EnlistTransaction utlöser ett undantag om anslutningen redan har påbörjat en transaktion med hjälp av anslutningens BeginTransaction metod. Men om transaktionen är en lokal transaktion som startas vid datakällan (till exempel om du kör BEGIN TRANSACTION-instruktionen explicit med hjälp av en SqlCommand) EnlistTransaction återställs den lokala transaktionen och den befintliga distribuerade transaktionen registreras på begäran. Du får inget meddelande om att den lokala transaktionen har återställts och måste hantera lokala transaktioner som inte har startats med .BeginTransaction Om du använder .NET Framework Data Provider för SQL Server (SqlClient) med SQL Server utlöser ett försök att registrera ett undantag. Alla andra fall kommer att gå oupptäckta.

Promotable-transaktioner i SQL Server

SQL Server stöder promotable-transaktioner där en lokal enkel transaktion automatiskt kan höjas upp till en distribuerad transaktion endast om det krävs. En promotable-transaktion anropar inte den extra kostnaden för en distribuerad transaktion såvida inte den extra kostnaden krävs. Mer information och ett kodexempel finns i System.Transactions-integrering med SQL Server.

Konfigurera distribuerade transaktioner

Du kan behöva aktivera MS DTC över nätverket för att kunna använda distribuerade transaktioner. Om windowsbrandväggen är aktiverad måste du tillåta att MS DTC-tjänsten använder nätverket eller öppnar MS DTC-porten.

Se även