Transacciones localesLocal Transactions

Las transacciones de ADO.NET se usan cuando se desea enlazar varias tareas juntas para que se ejecuten como una sola unidad de trabajo.Transactions in ADO.NET are used when you want to bind multiple tasks together so that they execute as a single unit of work. Por ejemplo, imagine que una aplicación realiza dos tareas.For example, imagine that an application performs two tasks. Primero, actualiza una tabla con información de pedidos.First, it updates a table with order information. Luego, actualiza una tabla que contiene la información de inventario, cargando en cuenta los elementos pedidos.Second, it updates a table that contains inventory information, debiting the items ordered. Si se produce un error en cualquiera de las tareas, se revierten ambas.If either task fails, then both updates are rolled back.

Determinación del tipo de transacciónDetermining the Transaction Type

Una transacción se considera una transacción local cuando es una transacción de una sola fase y se controla directamente por la base de datos.A transaction is considered to be a local transaction when it is a single-phase transaction and is handled by the database directly. Una transacción se considera una transacción distribuida cuando está coordinada por un monitor de transacciones y utiliza mecanismos de error (como confirmación en dos fases) para la resolución de transacciones.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.

Cada uno de los proveedores de datos de .NET Framework Transaction tiene su propio objeto para realizar transacciones locales.Each of the .NET Framework data providers has its own Transaction object for performing local transactions. Si necesita que se realice una transacción en una base de datos de SQL Server, seleccione una transacción de System.Data.SqlClient.If you require a transaction to be performed in a SQL Server database, select a System.Data.SqlClient transaction. En transacciones de Oracle, utilice el proveedor System.Data.OracleClient.For an Oracle transaction, use the System.Data.OracleClient provider. Además, hay una DbTransaction clase que está disponible para escribir código independiente del proveedor que requiere transacciones.In addition, there is a DbTransaction class that is available for writing provider-independent code that requires transactions.

Nota

Las transacciones son más eficaces cuando se realizan en el servidor.Transactions are most efficient when they are performed on the server. Si trabaja con una base de datos de SQL Server que hace uso masivo de transacciones explícitas, debería estudiar la posibilidad de escribirlas como procedimientos almacenados mediante la instrucción BEGIN TRANSACTION de Transact-SQL.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.

Realización de una transacción mediante una única conexiónPerforming a Transaction Using a Single Connection

En ADO.net, las transacciones se controlan Connection con el objeto.In ADO.NET, you control transactions with the Connection object. Puede iniciar una transacción local con el método BeginTransaction.You can initiate a local transaction with the BeginTransaction method. Una vez iniciada una transacción, puede inscribir un comando en esa transacción con la propiedad Transaction de un objeto Command.Once you have begun a transaction, you can enlist a command in that transaction with the Transaction property of a Command object. Luego, puede confirmar o revertir las modificaciones realizadas en el origen de datos según el resultado correcto o incorrecto de los componentes de la transacción.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.

Nota

El método EnlistDistributedTransaction no se debe emplear en transacciones locales.The EnlistDistributedTransaction method should not be used for a local transaction.

El ámbito de la transacción está limitado a la conexión.The scope of the transaction is limited to the connection. En el siguiente ejemplo se realiza una transacción explícita que consta de por dos comandos independientes en el bloque try.The following example performs an explicit transaction that consists of two separate commands in the try block. Los comandos ejecutan instrucciones INSERT en la tabla Production. ScrapReason de la base de datos de ejemplo AdventureWorks SQL Server, que se confirman si no se inicia ninguna excepción.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. El código del bloque catch revierte la transacción si se produce una excepción.The code in the catch block rolls back the transaction if an exception is thrown. Si la transacción se anula o la conexión se cierra antes de que se haya completado la transacción, ésta se revierte automáticamente.If the transaction is aborted or the connection is closed before the transaction has completed, it is automatically rolled back.

EjemploExample

Para llevar a cabo una transacción, siga estos pasos.Follow these steps to perform a transaction.

  1. Llame al método BeginTransaction del objeto SqlConnection para marcar el comienzo de la transacción.Call the BeginTransaction method of the SqlConnection object to mark the start of the transaction. El método BeginTransaction devuelve una referencia a la transacción.The BeginTransaction method returns a reference to the transaction. Esta referencia se asigna a los objetos SqlCommand que están inscritos en la transacción.This reference is assigned to the SqlCommand objects that are enlisted in the transaction.

  2. Asigne el objeto Transaction a la propiedad Transaction del objeto SqlCommand que se va a ejecutar.Assign the Transaction object to the Transaction property of the SqlCommand to be executed. Si el comando se ejecuta en una conexión con una transacción activa y el objeto Transaction no se ha asignado a la propiedad Transaction del objeto Command, se inicia una excepción.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. Ejecute los comandos necesarios.Execute the required commands.

  4. Llame al método Commit del objeto SqlTransaction para completar la transacción, o al método Rollback para finalizarla.Call the Commit method of the SqlTransaction object to complete the transaction, or call the Rollback method to end the transaction. Si la conexión se cierra o elimina antes de que se hayan ejecutado los métodos Commit o Rollback, la transacción se revierte.If the connection is closed or disposed before either the Commit or Rollback methods have been executed, the transaction is rolled back.

En el ejemplo de código siguiente se muestra la lógica transaccional mediante ADO.NET con Microsoft SQL Server.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

Vea tambiénSee also