Lokale TransaktionenLocal Transactions

Transaktionen werden in ADO.NET verwendet, wenn mehrere Aufgaben miteinander verbunden werden sollen, damit sie als eine einzige Verarbeitungseinheit ausgeführt werden können.Transactions in ADO.NET are used when you want to bind multiple tasks together so that they execute as a single unit of work. Stellen Sie sich z. B. vor, dass eine Anwendung zwei Aufgaben ausführt.For example, imagine that an application performs two tasks. Zum einen aktualisiert sie eine Tabelle mit Bestellinformationen.First, it updates a table with order information. Zum anderen aktualisiert sie eine Tabelle mit Bestandsinformationen und bucht die bestellten Artikel ab.Second, it updates a table that contains inventory information, debiting the items ordered. Wenn eine der beiden Aufgaben fehlschlägt, wird für beide Updates ein Rollback ausgeführt.If either task fails, then both updates are rolled back.

Bestimmen des TransaktionstypsDetermining the Transaction Type

Eine Transaktion wird als lokale Transaktion betrachtet, wenn es sich um eine Einphasentransaktion handelt, die von der Datenbank direkt verarbeitet wird.A transaction is considered to be a local transaction when it is a single-phase transaction and is handled by the database directly. Eine Transaktion wird als verteilte Transaktion betrachtet, wenn Sie durch einen Transaktions Monitor koordiniert wird und ausfallsichere Mechanismen (z. b. Zweiphasencommit) für die Transaktions Auflösung verwendet.A transaction is considered to be a distributed transaction when it is coordinated by a transaction monitor and uses fail-safe mechanisms (such as two-phase commit) for transaction resolution.

Die einzelnen .NET Framework-Datenanbieter verfügen jeweils über ein eigenes Transaction-Objekt für das Ausführen lokaler Transaktionen.Each of the .NET Framework data providers has its own Transaction object for performing local transactions. Wählen Sie eine System.Data.SqlClient-Transaktion, wenn eine Transaktion in einer SQL Server-Datenbank ausgeführt werden muss.If you require a transaction to be performed in a SQL Server database, select a System.Data.SqlClient transaction. Verwenden Sie für eine Oracle-Transaktion den System.Data.OracleClient-Anbieter.For an Oracle transaction, use the System.Data.OracleClient provider. Außerdem gibt es eine DbTransaction -Klasse, die zum Schreiben von Anbieter unabhängigem Code verfügbar ist, der Transaktionen erfordert.In addition, there is a DbTransaction class that is available for writing provider-independent code that requires transactions.

Hinweis

Transaktionen sind am effizientesten, wenn Sie auf dem Server ausgeführt werden.Transactions are most efficient when they are performed on the server. Wenn Sie mit einer SQL Server-Datenbank arbeiten, die häufig explizite Transaktionen verwendet, empfiehlt es sich, die Transaktionen unter Verwendung der BEGIN TRANSACTION-Anweisung von Transact-SQL als gespeicherte Prozeduren zu schreiben.If you are working with a SQL Server database that makes extensive use of explicit transactions, consider writing them as stored procedures using the Transact-SQL BEGIN TRANSACTION statement.

Ausführen einer Transaktion unter Verwendung einer einzelnen VerbindungPerforming a Transaction Using a Single Connection

In ADO.NET können Sie Transaktionen mit dem Connection-Objekt steuern.In ADO.NET, you control transactions with the Connection object. Zum Initiieren einer lokalen Transaktion steht Ihnen die BeginTransaction-Methode zur Verfügung.You can initiate a local transaction with the BeginTransaction method. Nachdem Sie eine Transaktion gestartet haben, können Sie mit der Transaction-Eigenschaft eines Command-Objekts einen Befehl in dieser Transaktion eintragen.Once you have begun a transaction, you can enlist a command in that transaction with the Transaction property of a Command object. Dann können Sie für Änderungen an der Datenquelle auf Grundlage des Erfolgs oder Fehlschlags der Komponenten der Transaktion einen Commit oder Rollback ausführen.You can then commit or roll back modifications made at the data source based on the success or failure of the components of the transaction.

Hinweis

Die EnlistDistributedTransaction-Methode darf nicht für eine lokale Transaktion verwendet werden.The EnlistDistributedTransaction method should not be used for a local transaction.

Der Gültigkeitsbereich der Transaktion ist auf die Verbindung beschränkt.The scope of the transaction is limited to the connection. Im folgenden Beispiel wird eine explizite Transaktion ausgeführt, die aus zwei separaten Befehlen im try-Block besteht.The following example performs an explicit transaction that consists of two separate commands in the try block. Die Befehle führen INSERT-Anweisungen für die Production. ScrapReason-Tabelle in der AdventureWorks-SQL Server-Beispieldatenbank aus, für die ein Commit ausgeführt wird, wenn keine Ausnahmen ausgelöst werden.The commands execute INSERT statements against the Production.ScrapReason table in the AdventureWorks SQL Server sample database, which are committed if no exceptions are thrown. Wenn eine Ausnahme ausgelöst wird, führt der Code im catch-Block einen Rollback für die Transaktion aus.The code in the catch block rolls back the transaction if an exception is thrown. Wenn die Transaktion abgebrochen oder die Verbindung geschlossen wird, bevor die Transaktion beendet wurde, wird automatisch ein Rollback für die Transaktion ausgeführt.If the transaction is aborted or the connection is closed before the transaction has completed, it is automatically rolled back.

BeispielExample

Führen Sie diese Schritte aus, um eine Transaktion auszuführen:Follow these steps to perform a transaction.

  1. Rufen Sie die BeginTransaction-Methode des SqlConnection-Objekts auf, um den Start der Transaktion festzulegen.Call the BeginTransaction method of the SqlConnection object to mark the start of the transaction. Die BeginTransaction-Methode gibt einen Verweis auf die Transaktion zurück.The BeginTransaction method returns a reference to the transaction. Dieser Verweis wird den SqlCommand-Objekten zugeordnet, die in der Transaktion eingetragen sind.This reference is assigned to the SqlCommand objects that are enlisted in the transaction.

  2. Weisen Sie das Transaction-Objekt der Transaction-Eigenschaft des auszuführenden SqlCommand zu.Assign the Transaction object to the Transaction property of the SqlCommand to be executed. Wenn ein Befehl für eine Verbindung mit einer aktiven Transaktion ausgeführt wird und das Transaction-Objekt nicht der Transaction-Eigenschaft des Command-Objekts zugewiesen wurde, wird eine Ausnahme ausgelöst.If a command is executed on a connection with an active transaction, and the Transaction object has not been assigned to the Transaction property of the Command object, an exception is thrown.

  3. Führen Sie die erforderlichen Befehle aus.Execute the required commands.

  4. Rufen Sie die Commit-Methode des SqlTransaction-Objekts auf, um die Transaktion abzuschließen, oder rufen Sie die Rollback-Methode auf, um die Transaktion zu beenden.Call the Commit method of the SqlTransaction object to complete the transaction, or call the Rollback method to end the transaction. Wenn die Verbindung vor dem Ausführen der Commit-Methode oder der Rollback-Methode geschlossen oder verworfen wurde, wird für die Transaktion ein Rollback ausgeführt.If the connection is closed or disposed before either the Commit or Rollback methods have been executed, the transaction is rolled back.

Im folgenden Codebeispiel wird die Transaktionslogik unter Verwendung von ADO.NET mit Microsoft SQL Server veranschaulicht.The following code example demonstrates transactional logic using ADO.NET with Microsoft SQL Server.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    // Start a local transaction.
    SqlTransaction sqlTran = connection.BeginTransaction();

    // Enlist a command in the current transaction.
    SqlCommand command = connection.CreateCommand();
    command.Transaction = sqlTran;

    try
    {
        // Execute two separate commands.
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')";
        command.ExecuteNonQuery();
        command.CommandText =
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')";
        command.ExecuteNonQuery();

        // Commit the transaction.
        sqlTran.Commit();
        Console.WriteLine("Both records were written to database.");
    }
    catch (Exception ex)
    {
        // Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message);

        try
        {
            // Attempt to roll back the transaction.
            sqlTran.Rollback();
        }
        catch (Exception exRollback)
        {
            // Throws an InvalidOperationException if the connection 
            // is closed or the transaction has already been rolled 
            // back on the server.
            Console.WriteLine(exRollback.Message);
        }
    }
}
Using connection As New SqlConnection(connectionString)
    connection.Open()

    ' Start a local transaction.
    Dim sqlTran As SqlTransaction = connection.BeginTransaction()

    ' Enlist a command in the current transaction.
    Dim command As SqlCommand = connection.CreateCommand()
    command.Transaction = sqlTran

    Try
        ' Execute two separate commands.
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')"
        command.ExecuteNonQuery()
        command.CommandText = _
          "INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')"
        command.ExecuteNonQuery()

        ' Commit the transaction
        sqlTran.Commit()
        Console.WriteLine("Both records were written to database.")

    Catch ex As Exception
        ' Handle the exception if the transaction fails to commit.
        Console.WriteLine(ex.Message)

        Try
            ' Attempt to roll back the transaction.
            sqlTran.Rollback()

        Catch exRollback As Exception
            ' Throws an InvalidOperationException if the connection 
            ' is closed or the transaction has already been rolled 
            ' back on the server.
            Console.WriteLine(exRollback.Message)
        End Try
    End Try
End Using

Siehe auchSee also