Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: .NET Framework
.NET
Standard
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.
Opmerking
Voor informatie over gedistribueerde transacties in Azure SQL Database en Azure SQL Managed Instance, zie Gedistribueerde transacties over clouddatabases.
Werken met System.Transactions
In .NET 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 werd expliciete inschrijving in gedistribueerde transacties uitgevoerd met behulp van de EnlistDistributedTransaction methode van een verbinding om een verbinding toe te voegen aan een ITransaction instantie, ter ondersteuning van 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 Microsoft SqlClient-gegevensprovider 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-integratie met SQL Server voor meer informatie.
Automatisch deelnemen aan een gedistribueerde transactie
Automatische aanmelding is de standaard (en voorkeuzemethode) om ADO.NET-verbindingen met System.Transactions te integreren. Een verbindingsobject wordt automatisch in een bestaande gedistribueerde transactie opgenomen als wordt bepaald dat een transactie actief is, wat in System.Transaction termen betekent dat Transaction.Current niet null is. Automatisch aanmelden van de transactie vindt plaats wanneer de verbinding wordt geopend. Het gebeurt daarna niet, zelfs niet als een opdracht wordt uitgevoerd binnen een transactiebereik. U kunt automatische registratie in bestaande transacties uitschakelen door Enlist=false op te geven als een verbindingsreeksparameter voor een SqlConnection.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 SqlConnection object voor de Microsoft SqlClient-gegevensprovider voor SQL Server. 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.
Opmerking
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.
Opname in gedistribueerde transacties is met name van toepassing bij het groeperen van bedrijfsobjecten. Als een bedrijfsobject is gepoold met een open verbinding, vindt automatische transactiedeelneming 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 transactie-insluiting voor de verbinding deactiveren en de verbinding in transacties opnemen 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.
Opmerking
Zodra een verbinding expliciet is geregistreerd in een transactie, kan deze niet uit die transactie worden verwijderd of in een andere transactie worden geregistreerd totdat de eerste transactie is voltooid.
Waarschuwing
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 u moet lokale transacties die niet zijn gestart met BeginTransaction, zelf beheren. Als u de Microsoft SqlClient-gegevensprovider voor SQL Server met SQL Server gebruikt, zal een poging om u in te schrijven een uitzondering veroorzaken. Alle andere gevallen worden niet gedetecteerd.
Promotable-transacties 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-integratie met 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 de lokale Windows Firewall van de server is ingeschakeld, moet u toestaan dat de MS DTC-service het netwerk gebruikt of de MS DTC-poort opent.