Share via


Inscribir en una transacción distribuida

El objeto Connection se inscribirá de forma automática en una transacción distribuida ya existente si determina que hay una transacción activa. La inscripción automática de transacciones se produce cuando se abre o se recupera la conexión desde la agrupación de conexiones. Puede deshabilitar la inscripción automática de las transacciones existentes mediante la especificación Enlist=false como parámetro de la cadena de conexión para SqlConnection u OLE DB Services=-7 como parámetro de la cadena de conexión para OleDbConnection.

Si la inscripción automática está deshabilitada, puede inscribirse en una transacción distribuida ya existente mediante el método EnlistDistributedTransaction del objeto Connection. La inscripción en una transacción distribuida ya existente garantiza que, si la transacción se confirma o se deshace, las modificaciones realizadas mediante código en el origen de datos también se confirman o se deshacen.

EnlistDistributedTransaction se puede aplicar en particular a la agrupación de objetos comerciales. Si un objeto comercial se agrupa con una conexión abierta, la inscripción automática de transacciones sólo se produce si dicha conexión se abre o se extrae de la agrupación de conexiones. Si se realizan varias transacciones con el objeto comercial agrupado, la conexión abierta para ese objeto no se inscribirá de forma automática en las transacciones recién iniciadas. En este caso, puede deshabilitar la inscripción automática de transacciones para el objeto Connection e inscribir dicho objeto en las transacciones mediante EnlistDistributedTransaction.

EnlistDistributedTransaction toma un único argumento del tipo ITransaction que es una referencia a la transacción existente. Después de llamar a Connection.EnlistDistributedTransaction, todas las modificaciones realizadas en el origen de datos utilizando Connection se incluyen en la transacción.

Nota   Connection debe abrirse antes de llamar a EnlistDistributedTransaction.

PRECAUCIÓN   EnlistDistributedTransaction devuelve una excepción Exception si Connection ya ha comenzado una transacción utilizando BeginTransaction. Sin embargo, si la transacción es de tipo local y se ha comenzado en el origen de datos (por ejemplo, ejecutando la instrucción BEGIN TRANSACTION de forma explícita mediante SqlCommand), EnlistDistributedTransaction deshace la transacción local y realiza la inscripción en la transacción distribuida ya existente tal y como se solicitó. El usuario no recibirá ningún aviso de que la transacción local se ha deshecho y será responsable de administrar las transacciones locales que no se hayan iniciado mediante BeginTransaction.

En el siguiente ejemplo se muestra una página ASP.NET que requiere una transacción. El código de ADO.NET de la página realiza la inscripción en la transacción.

<%@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 " & customerId & " added.")
  Catch e As Exception
    ContextUtil.SetAbort()
    Response.Write("Customer " & 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 " + customerId + " added.");
  }
  catch (Exception e)
  {
    ContextUtil.SetAbort();
    Response.Write("Customer " + 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>

Vea también

Utilizar proveedores de datos de .NET Framework para obtener acceso a datos | OleDbConnection (Clase) | OleDbTransaction (Clase) | SqlConnection (Clase) | SqlTransaction (Clase) | OdbcConnection (Clase) | OdbcTransaction (Clase)