Delen via


Gedistribueerde transacties

Een transactie is een reeks gerelateerde taken die onder andere slagen (doorvoeren) of mislukken (afbreken) als een eenheid. Een gedistribueerde transactie is een transactie die van invloed is op verschillende resources. Voor een gedistribueerde transactie die moet worden doorgevoerd, moeten alle deelnemers garanderen dat wijzigingen in gegevens permanent zijn. Wijzigingen moeten blijven bestaan ondanks systeemcrashes of andere onvoorziene gebeurtenissen. Als zelfs één deelnemer deze garantie niet kan maken, mislukt de hele transactie en worden eventuele wijzigingen in gegevens binnen het bereik van de transactie teruggedraaid.

Notitie

Er wordt een uitzondering gegenereerd als u een transactie probeert door te voeren of terug te draaien als een DataReader transactie wordt gestart terwijl de transactie actief is.

Werken met System.Transactions

In .NET Framework worden gedistribueerde transacties beheerd via de API in de System.Transactions naamruimte. De System.Transactions API delegeert gedistribueerde transactieafhandeling naar een transactiemonitor, zoals de Microsoft DTC (Distributed Transaction Coordinator) wanneer meerdere permanente resourcemanagers betrokken zijn. Zie Basisprincipes van transacties voor meer informatie.

ADO.NET 2.0 heeft ondersteuning geïntroduceerd voor het opnemen in een gedistribueerde transactie met behulp van de EnlistTransaction methode, die een verbinding in een Transaction exemplaar insluit. In eerdere versies van ADO.NET is expliciete opname in gedistribueerde transacties uitgevoerd met behulp van de EnlistDistributedTransaction methode van een verbinding om een verbinding in te schakelen in een ITransaction exemplaar, dat wordt ondersteund voor compatibiliteit met eerdere versies. Zie Interoperabiliteit met Enterprise Services en COM+-transacties voor meer informatie over Enterprise Services-transacties.

Wanneer u een System.Transactions transactie gebruikt met de .NET Framework-provider voor SQL Server op basis van een SQL Server-database, wordt automatisch een lichtgewicht Transaction gebruikt. De transactie kan vervolgens worden gepromoveerd naar een volledige gedistribueerde transactie op basis van behoefte. Zie System.Transactions Integration with SQL Server (System.Transactions Integration with SQL Server) voor meer informatie.

Notitie

Het maximum aantal gedistribueerde transacties waaraan een Oracle-database tegelijk kan deelnemen, is standaard ingesteld op 10. Na de 10e transactie wanneer deze is verbonden met een Oracle-database, wordt er een uitzondering gegenereerd. Oracle biedt geen ondersteuning DDL binnen een gedistribueerde transactie.

Automatisch inschrijven in een gedistribueerde transactie

Automatische opname is de standaard (en voorkeursinstelling) manier om ADO.NET verbindingen met System.Transactionste integreren. Een verbindingsobject wordt automatisch in een bestaande gedistribueerde transactie opgenomen als wordt bepaald dat een transactie actief is, wat betekent System.Transaction dat dit Transaction.Current niet null is. Automatische transactielijst vindt plaats wanneer de verbinding wordt geopend. Het gebeurt daarna niet, zelfs niet als een opdracht wordt uitgevoerd binnen een transactiebereik. U kunt automatische opname in bestaande transacties uitschakelen door op te Enlist=false geven als een verbindingsreeks parameter voor een SqlConnection.ConnectionString, of OLE DB Services=-7 als een verbindingsreeks parameter voor een OleDbConnection.ConnectionString. Zie en OdbcConnection.ConnectionStringvoor meer informatie over Oracle- en ODBC-verbindingsreeks parametersOracleConnection.ConnectionString.

Handmatig inschrijven in een gedistribueerde transactie

Als automatisch insluiten is uitgeschakeld of u een transactie moet inschakelen die is gestart nadat de verbinding is geopend, kunt u een bestaande gedistribueerde transactie inschakelen met behulp van de EnlistTransaction methode van het DbConnection object voor de provider waarmee u werkt. Door een bestaande gedistribueerde transactie in te schakelen, zorgt u ervoor dat, als de transactie wordt doorgevoerd of teruggedraaid, wijzigingen die door de code in de gegevensbron worden aangebracht, ook worden doorgevoerd of teruggedraaid.

Opname in gedistribueerde transacties is met name van toepassing bij het groeperen van bedrijfsobjecten. Als een bedrijfsobject is gegroepeerd met een open verbinding, vindt automatische transactielisten alleen plaats wanneer die verbinding wordt geopend. Als er meerdere transacties worden uitgevoerd met behulp van het gegroepeerde bedrijfsobject, wordt de geopende verbinding voor dat object niet automatisch opgenomen in nieuw geïnitieerde transacties. In dit geval kunt u automatische transactielijst voor de verbinding uitschakelen en de verbinding inschakelen in transacties met behulp van EnlistTransaction.

EnlistTransaction gebruikt één argument van het type Transaction dat een verwijzing naar de bestaande transactie is. Nadat de verbindingsmethode EnlistTransaction is aangeroepen, worden alle wijzigingen in de gegevensbron met behulp van de verbinding opgenomen in de transactie. Als u een null-waarde doorgeeft, wordt de verbinding uit de huidige gedistribueerde transactielijst verwijderd. Houd er rekening mee dat de verbinding moet worden geopend voordat u aanroept EnlistTransaction.

Notitie

Zodra een verbinding expliciet is opgenomen in een transactie, kan deze niet in een andere transactie worden opgenomen of in een andere transactie worden opgenomen totdat de eerste transactie is voltooid.

Let op

EnlistTransaction genereert een uitzondering als de verbinding al een transactie heeft gestart met behulp van de methode van BeginTransaction de verbinding. Als de transactie echter een lokale transactie is die is gestart bij de gegevensbron (bijvoorbeeld het uitvoeren van de INSTRUCTIE BEGIN TRANSACTION expliciet met behulp van een SqlCommand), EnlistTransaction wordt de lokale transactie teruggedraaid en wordt de bestaande gedistribueerde transactie opgenomen zoals aangevraagd. U ontvangt geen melding dat de lokale transactie is teruggedraaid en dat lokale transacties die niet zijn gestart, moeten worden beheerd BeginTransaction. Als u de .NET Framework-gegevensprovider voor SQL Server (SqlClient) met SQL Server gebruikt, genereert een poging om een uitzondering op te geven. Alle andere gevallen worden niet gedetecteerd.

Promotable Transactions in SQL Server

SQL Server biedt ondersteuning voor promotietransacties waarbij een lokale lichtgewicht transactie automatisch kan worden gepromoveerd naar een gedistribueerde transactie als dit vereist is. Een promotiebare transactie roept de toegevoegde overhead van een gedistribueerde transactie niet aan, tenzij de toegevoegde overhead vereist is. Zie System.Transactions Integration with SQL Server (System.Transactions Integration with SQL Server) voor meer informatie en een codevoorbeeld.

Gedistribueerde transacties configureren

Mogelijk moet u de MS DTC via het netwerk inschakelen om gedistribueerde transacties te kunnen gebruiken. Als Windows Firewall is ingeschakeld, moet u toestaan dat de MS DTC-service het netwerk gebruikt of de MS DTC-poort opent.

Zie ook