Freigeben über


Eintragen in eine verteilte Transaktion

Wenn das Connection-Objekt feststellt, dass eine Transaktion aktiv ist, trägt es sich automatisch in eine vorhandene verteilte Transaktion ein. Die automatische Transaktionseintragung erfolgt, wenn die Verbindung hergestellt oder aus dem Verbindungspool abgerufen wird. Die automatische Eintragung in vorhandene Transaktionen lässt sich durch die Angabe von Enlist=false als Parameter der Verbindungszeichenfolge für eine SqlConnection oder von OLE DB Services=-7 als Parameter der Verbindungszeichenfolge für eine OleDbConnection deaktivieren.

Wenn die automatische Eintragung deaktiviert ist, können Sie mit der EnlistDistributedTransaction-Methode des Connection-Objekts Eintragungen in einer vorhandenen verteilten Transaktion vornehmen. Durch Eintragungen in eine vorhandene verteilte Transaktion stellen Sie sicher, dass Änderungen, die durch Code an der Datenquelle vorgenommen wurden, beim Speichern oder Zurücksetzen der Transaktion ebenfalls gespeichert oder zurückgesetzt werden.

EnlistDistributedTransaction ist besonders geeignet beim Pooling von Geschäftsobjekten. Befindet sich ein Geschäftsobjekt mit einer geöffneten Verbindung in einem Pool, erfolgt die automatische Transaktionseintragung nur, wenn diese Verbindung geöffnet oder aus dem Verbindungspool herausgenommen wird. Wenn mehrere Transaktionen unter Verwendung des Geschäftsobjekts im Pool durchgeführt werden, wird die für das Objekt geöffnete Verbindung nicht automatisch in neu initialisierte Transaktionen eingetragen. In diesem Fall können Sie die automatische Transaktionseintragung für die Connection deaktivieren und die Connection mit EnlistDistributedTransaction in Transaktionen eintragen.

EnlistDistributedTransaction akzeptiert ein einzelnes Argument vom Typ ITransaction, das einen Verweis auf eine vorhandene Transaktion darstellt. Nach dem Aufruf von Connection.EnlistDistributedTransaction werden alle Änderungen, die mit der Connection an der Datenquelle vorgenommen wurden, in die Transaktion eingetragen.

Hinweis   Die Connection muss vor dem Aufruf von EnlistDistributedTransaction geöffnet sein.

Vorsicht   Wenn die Connection durch den Aufruf von BeginTransaction bereits eine Transaktion gestartet hat, gibt EnlistDistributedTransaction eine Ausnahme zurück. Wenn es sich bei dieser Transaktion jedoch um eine in der Datenquelle gestartete lokale Transaktion handelt (wenn z. B. die BEGIN TRANSACTION-Anweisung explizit mit einem SqlCommand ausgeführt wird), führt EnlistDistributedTransaction einen Rollback für die lokale Transaktion aus und nimmt die Eintragung in die vorhandene verteilte Transaktion wie angefordert vor. Sie erhalten keine Benachrichtigung über den Rollback der lokalen Transaktion und müssen alle lokalen Transaktionen, die nicht mit BeginTransaction gestartet wurden, selbst verwalten.

Das folgende Beispiel enthält eine ASP.NET-Seite, für die eine Transaktion erforderlich ist. ADO.NET-Code innerhalb der Seite wird in die Transaktion eingetragen.

<%@Page Transaction="Required" %> 
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>

<html>
<Script Runat="SERVER" Language="VB">

Sub Page_Load()
  Dim ns As NorthwindSample = New NorthwindSample()

  Dim customerId As String = "CUST1"
  Dim companyName As String = "New Company Name"

  Try
    ns.AddCustomer(customerId, companyName, CType(ContextUtil.Transaction, ITransaction))
    ContextUtil.SetComplete()
    Response.Write("Customer " & Server.HtmlEncode(customerId) & " added.")
  Catch e As Exception
    ContextUtil.SetAbort()
    Response.Write("Customer " & Server.HtmlEncode(customerId) & " not added. An exception of type " & _
                   e.GetType().ToString() & " was encountered.")
  End Try
End Sub


Public Class NorthwindSample

  Public Sub AddCustomer(customerId As String, companyName As String, trans As ITransaction)
  
    Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
                                                      "Initial Catalog=Northwind;Enlist=false;")

    Dim cmd As SqlCommand = New SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " & _
                                           "Values(@CustomerId, @CompanyName)", nwindConn)
    cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId
    cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName

    nwindConn.Open()

    If Not trans Is Nothing Then
      nwindConn.EnlistDistributedTransaction(trans)
    End If

    Try
      cmd.ExecuteNonQuery()
    Catch e As SqlException
      Throw e
    finally
      nwindConn.Close()
    End Try
  End Sub

End Class
</Script>
</html>
[C#]
<%@Page Transaction="Required" %> 
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>
<%@Import Namespace="System.EnterpriseServices"%>

<html>
<Script Runat="SERVER" Language="C#">

void Page_Load()
{
  NorthwindSample ns = new NorthwindSample();

  string customerId = "CUST1";
  string companyName = "New Company Name";

  try
  {
    ns.AddCustomer(customerId, companyName, (ITransaction)ContextUtil.Transaction);
    ContextUtil.SetComplete();
    Response.Write("Customer " + Server.HtmlEncode(customerId) + " added.");
  }
  catch (Exception e)
  {
    ContextUtil.SetAbort();
    Response.Write("Customer " + Server.HtmlEncode(customerId) + " not added. An exception of type " + e.GetType() + " was encountered.");
  }
}


public class NorthwindSample
{
  public void AddCustomer(string customerId, string companyName, ITransaction trans)
  {
    SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;" +
                                                "Initial Catalog=Northwind;Enlist=false;");

    SqlCommand cmd = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " +
                                    "Values(@CustomerId, @CompanyName)", nwindConn);
    cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 5).Value = customerId;
    cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40).Value = companyName;

    nwindConn.Open();

    if (trans != null)
      nwindConn.EnlistDistributedTransaction(trans);

    try
    {
      cmd.ExecuteNonQuery();
    }
    catch (SqlException e)
    {
      throw(e);
    }
    finally
    {
      nwindConn.Close();
    }
  }
}
</Script>
</html>

Siehe auch

Datenzugriff mit .NET Framework-Datenprovidern | OleDbConnection-Klasse | OleDbTransaction-Klasse | SqlConnection-Klasse | SqlTransaction-Klasse | OdbcConnection-Klasse | OdbcTransaction-Klasse