Controlar transacciones (motor de base de datos)
Las aplicaciones controlan las transacciones principalmente al especificar cuándo se inicia y finaliza una transacción. Se pueden especificar mediante instrucciones Transact-SQL o funciones de la interfaz de programación de aplicaciones (API) de bases de datos. El sistema también debe ser capaz de controlar correctamente los errores que terminan una transacción antes de que se concluya.
De manera predeterminada, las transacciones se administran en las conexiones. Cuando se inicia una transacción en una conexión, todas las instrucciones Transact-SQL ejecutadas en esa conexión forman parte de la transacción hasta que ésta finaliza. No obstante, en una sesión de conjunto de resultados activos múltiples (MARS), una transacción de Transact-SQL explícita o implícita se convierte en una transacción de lote que se administra en los lotes. Cuando se termina el lote, si la transacción de lote no se confirma ni se revierte, SQL Server la revierte automáticamente.
Iniciar transacciones
Mediante funciones de la API e instrucciones Transact-SQL, puede iniciar transacciones en una instancia de SQL Server Database Engine (Motor de base de datos de SQL Server) como transacciones explícitas, de confirmación automática o implícitas. En una sesión de MARS, las transacciones de Transact-SQL explícitas e implícitas se convierten en transacciones de lote.
- Transacciones explícitas
Inicie una transacción de forma explícita mediante una función de la API o emitiendo la instrucción Transact-SQL BEGIN TRANSACTION.
- Transacciones de confirmación automática
El modo predeterminado para el Database Engine (Motor de base de datos). Cada instrucción Transact-SQL se confirma cuando termina. No tiene que especificar instrucciones para controlar las transacciones.
- Transacciones implícitas
Establezca el modo de transacción implícita a través de una función de la API o la instrucción SET IMPLICIT_TRANSACTIONS ON de Transact-SQL. La siguiente instrucción inicia automáticamente una nueva transacción. Cuando se concluye la transacción, la instrucción Transact-SQL siguiente inicia una nueva transacción.
- Transacciones de lote
Una transacción Transact-SQL explícita o implícita que se inicia en una sesión de MARS se convierte en una transacción de lote, y es sólo aplicable a conjuntos de resultados activos múltiples (MARS). Si una transacción de lote no se confirma ni se revierte cuando se termina un lote, queda revertida por SQL Server automáticamente.
Los modos de transacción se administran en las conexiones. Si una conexión cambia de un modo de transacción a otro, no tiene efecto sobre los modos de transacción de otras conexiones.
Finalizar transacciones
Puede finalizar las transacciones con una instrucción COMMIT o ROLLBACK, o mediante una función de la API.
- COMMIT
Si una transacción es correcta, confírmela. La instrucción COMMIT garantiza que todas las modificaciones de la transacción se conviertan en una parte permanente de la base de datos. La instrucción COMMIT también libera recursos que utiliza la transacción como, por ejemplo, los bloqueos.
- ROLLBACK
Si se produce un error en una transacción o el usuario decide cancelar la transacción, revierta la transacción. La instrucción ROLLBACK revierte todas las modificaciones realizadas en la transacción al devolver los datos al estado en que estaban al inicio de la transacción. La instrucción ROLLBACK también libera los recursos que mantiene la transacción.
[!NOTA] En conexiones habilitadas para admitir varios conjuntos de resultados activos (MARS), una transacción explícita que se haya iniciado mediante una función de la API no se puede confirmar mientras haya solicitudes de ejecución pendientes. Cualquier intento de confirmación de una transacción de este tipo mientras se ejecutan operaciones pendientes tendrá como resultado un error.
Especificar los límites de la transacción
Puede identificar si las transacciones de Database Engine (Motor de base de datos) se inician y finalizan con instrucciones Transact-SQL o con funciones y métodos de la API.
- Instrucciones Transact-SQL
Utilice las instrucciones BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK y SET IMPLICIT_TRANSACTIONS para delinear transacciones. Se utilizan principalmente en aplicaciones de DB-Library y en secuencias de comandos Transact-SQL, como las secuencias de comandos que se ejecutan con el programa del símbolo del sistema osql.
- Funciones y métodos de la API
Las API de bases de datos, como ODBC, OLE DB y ADO, así como el espacio de nombres de .NET Framework SQLClient, contienen las funciones o los métodos utilizados para delinear transacciones. Estos son los mecanismos principales utilizados para controlar transacciones en una aplicación de Database Engine (Motor de base de datos).
Cada transacción se debe administrar solamente mediante uno de estos métodos. La utilización de varios métodos en la misma transacción puede conducir a resultados no definidos. Por ejemplo, no debe iniciar una transacción con las funciones de la API de ODBC y después utilizar la instrucción COMMIT de Transact-SQL para concluir la transacción. De esta forma, no notificaría al controlador ODBC de SQL Server que se confirmó la transacción. En este caso, utilice la función SQLEndTran de ODBC para finalizar la transacción.
Errores al procesar la transacción
Si un error impide la terminación correcta de una transacción, SQL Server revierte automáticamente la transacción y libera todos los recursos que mantiene la transacción. Si se interrumpe la conexión de red del cliente con una instancia de Database Engine (Motor de base de datos), las transacciones pendientes de la conexión revierten al estado anterior cuando la red notifica la interrupción a la instancia. Si la aplicación cliente falla o si el equipo cliente se bloquea o se reinicia, también se interrumpe la conexión y la instancia de Database Engine (Motor de base de datos) revierte las conexiones pendientes cuando la red le notifica la interrupción. Si el cliente cierra la aplicación, las transacciones pendientes se revierten.
Si se produce el error de una instrucción en tiempo de ejecución (como una infracción de restricciones) en un archivo por lotes, el comportamiento predeterminado de Database Engine (Motor de base de datos) consiste en revertir solamente la instrucción que generó el error. Puede modificar este comportamiento con la instrucción SET XACT_ABORT. Una vez ejecutada la instrucción SET XACT_ABORT ON, los errores de instrucciones en tiempo de ejecución hacen que se revierta automáticamente la transacción actual. Los errores de compilación, como los de sintaxis, no se ven afectados por SET XACT_ABORT. Para obtener más información, vea SET XACT_ABORT (Transact-SQL).
Cuando se producen errores, la acción correctora (COMMIT o ROLLBACK) debería incluirse en el código de aplicación. Una herramienta eficaz para controlar errores, incluidos los de transacciones, es la construcción TRY…CATCH de Transact-SQL. Para obtener más información y ejemplos que incluyan transacciones, vea Usar TRY...CATCH en Transact-SQL y TRY...CATCH (Transact-SQL).
Vea también
Conceptos
Transacciones (motor de la base de datos)
Otros recursos
BEGIN TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
COMMIT WORK (Transact-SQL)
SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Performing Transactions (ODBC)