Delen via


System.Transactions gebruiken

van toepassing op:SQL Server-

De System.Transactions-naamruimte biedt een transactieframework dat volledig is geïntegreerd met ADO.NET- en CLR-integratie (Common Language Runtime) van SQL Server. De System.Transactions.TransactionScope-klasse maakt een codeblok transactioneel door impliciet verbindingen in te schakelen in een gedistribueerde transactie. U moet de Complete methode aanroepen aan het einde van het codeblok dat is gemarkeerd door de TransactionScope. De methode Dispose wordt aangeroepen wanneer programma-uitvoering een codeblok verlaat, waardoor de transactie wordt stopgezet als de Complete methode niet wordt aangeroepen. Als er een uitzondering is opgetreden die ervoor zorgt dat de code het bereik verlaat, wordt de transactie als stopgezet beschouwd.

U wordt aangeraden een using blok te gebruiken om ervoor te zorgen dat de methode Dispose wordt aangeroepen op het TransactionScope-object wanneer het using blok wordt afgesloten. Als u transacties die in behandeling zijn niet doorvoert of terugdraait, kunnen de prestaties ernstig afnemen, omdat de standaardtime-out voor de TransactionScope één minuut is. Als u geen using-instructie gebruikt, moet u alle werkzaamheden uitvoeren in een Try blok en de Dispose methode expliciet aanroepen in het Finally blok.

Als er een uitzondering optreedt in de TransactionScope, wordt de transactie gemarkeerd als inconsistent en wordt deze afgelaten. Het wordt teruggedraaid wanneer de TransactionScope wordt verwijderd. Als er geen uitzondering optreedt, voeren deelnemende transacties door.

TransactionScope mag alleen worden gebruikt wanneer lokale en externe gegevensbronnen of externe resourcemanagers worden geopend, omdat TransactionScope altijd transacties veroorzaakt, zelfs als deze alleen binnen een contextverbinding worden gebruikt.

De klasse TransactionScope maakt standaard een transactie met een System.Transactions.Transaction.IsolationLevel van Serializable. Afhankelijk van uw toepassing kunt u overwegen het isolatieniveau te verlagen om conflicten in uw toepassing te voorkomen.

Notitie

U wordt aangeraden alleen updates, invoegingen en verwijderingen uit te voeren binnen gedistribueerde transacties op externe servers, omdat ze aanzienlijke databasebronnen verbruiken. Als de bewerking wordt uitgevoerd op de lokale server, is een gedistribueerde transactie niet nodig en volstaat een lokale transactie. SELECT instructies kunnen databasebronnen onnodig vergrendelen en in sommige scenario's is het mogelijk nodig om transacties voor selecties te gebruiken. Alle niet-databasewerkzaamheden moeten buiten het bereik van de transactie worden uitgevoerd, tenzij er andere transacted resourcemanagers betrokken zijn.

Hoewel een uitzondering binnen het bereik van de transactie voorkomt dat de transactie wordt doorgevoerd, heeft de TransactionScope-klasse geen inrichting voor het terugdraaien van wijzigingen die uw code aanbrengt buiten het bereik van de transactie zelf. Als u actie moet ondernemen wanneer de transactie wordt teruggedraaid, moet u uw eigen implementatie van de System.Transactions.IEnlistmentNotification-interface schrijven en expliciet in de transactie opnemen.

Voorbeelden

Als u met System.Transactionswilt werken, moet u een verwijzing naar het System.Transactions.dll-bestand hebben.

De volgende code laat zien hoe u een transactie maakt die kan worden gepromoveerd op twee verschillende exemplaren van SQL Server. Deze exemplaren worden vertegenwoordigd door twee verschillende System.Data.SqlClient.SqlConnection objecten, die zijn verpakt in een TransactionScope blok. De code maakt het TransactionScope blok met een using-instructie en opent de eerste verbinding, die deze automatisch in de TransactionScopeopgeeft. De transactie wordt in eerste instantie als een lichtgewicht transactie ingeschreven, niet als een volledige gedistribueerde transactie. In de code wordt ervan uitgegaan dat er voorwaardelijke logica bestaat (weggelaten voor beknoptheid). De tweede verbinding wordt alleen geopend als deze nodig is, en deze in de TransactionScopeop te halen.

Wanneer de verbinding wordt geopend, wordt de transactie automatisch gepromoveerd naar een volledige gedistribueerde transactie. De code roept vervolgens TransactionScope.Completeaan, waarmee de transactie wordt doorgevoerd. De code verwijdert de twee verbindingen bij het afsluiten van de using-instructies voor de verbindingen. De TransactionScope.Dispose methode voor de TransactionScope wordt automatisch aangeroepen bij beëindiging van het using blok voor de TransactionScope. Als er op enig moment in het TransactionScope blok een uitzondering is opgetreden, wordt Complete niet aangeroepen en wordt de gedistribueerde transactie teruggedraaid wanneer de TransactionScope wordt verwijderd.

using (TransactionScope transScope = new TransactionScope())
{
    using (SqlConnection connection1 = new
       SqlConnection(connectString1))
    {
        // Opening connection1 automatically enlists it in the
        // TransactionScope as a lightweight transaction.
        connection1.Open();

        // Do work in the first connection.

        // Assumes conditional logic in place where the second
        // connection will only be opened as needed.
        using (SqlConnection connection2 = new
            SqlConnection(connectString2))
        {
            // Open the second connection, which enlists the
            // second connection and promotes the transaction to
            // a full distributed transaction.
            connection2.Open();

            // Do work in the second connection.
        }
    }
    //  The Complete method commits the transaction.
    transScope.Complete();
}