Transacciones de confirmación automática
El modo de confirmación automática es el modo de administración de transacciones predeterminado de SQL Server Database Engine (Motor de base de datos de SQL Server). Cada instrucción Transact-SQL se confirma o se revierte cuando finaliza. Si una instrucción termina correctamente, se confirma; si encuentra un error, se revierte. Una conexión a una instancia de Database Engine (Motor de base de datos) funciona en modo de confirmación automática siempre que no se suplante el modo predeterminado mediante transacciones explícitas o implícitas. El modo de confirmación automática es también el modo predeterminado para ADO, OLE DB, ODBC y DB-Library.
Una conexión a una instancia de Database Engine (Motor de base de datos) funcionará en modo de confirmación automática hasta que la instrucción BEGIN TRANSACTION inicie una transacción explícita o se active el modo de transacción implícita. Cuando la transacción explícita se confirma o se revierte, o cuando se desactiva el modo de transacciones implícitas, la conexión vuelve al modo de confirmación automática.
Cuando es ON, SET IMPLICIT_TRANSACTIONS establece la conexión al modo de transacción implícita. Cuando es OFF, restablece la conexión al modo de transacción con confirmación automática.
Errores en tiempo de ejecución y de compilación
En el modo de confirmación automática, a veces parece que Database Engine (Motor de base de datos) ha revertido un proceso por lotes completo en vez de revertir solamente una instrucción SQL. Esto sucede si se trata de un error de compilación, no en el caso de un error en tiempo de ejecución. Los errores de compilación impiden que Database Engine (Motor de base de datos) genere un plan de ejecución, por lo que no se ejecuta ninguna instrucción del proceso por lotes. Aunque parezca que se han revertido todas las instrucciones anteriores a la que generó el error, el error impidió que se ejecutara ninguna instrucción del proceso por lotes. En este ejemplo, no se ejecutó ninguna de las instrucciones INSERT del tercer proceso por lotes debido a un error de compilación. Parece que se han revertido las dos primeras instrucciones INSERT cuando, en realidad, nunca se ejecutaron.
USE AdventureWorks;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc'); -- Syntax error.
GO
SELECT * FROM TestBatch; -- Returns no rows.
GO
En este ejemplo, la tercera instrucción INSERT genera un error de clave principal duplicada en tiempo de ejecución. Las dos primeras instrucciones INSERT eran correctas y se han confirmado, por lo que permanecen después de producirse el error en tiempo de ejecución.
USE AdventureWorks;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc'); -- Duplicate key error.
GO
SELECT * FROM TestBatch; -- Returns rows 1 and 2.
GO
Database Engine (Motor de base de datos) utiliza la resolución demorada de nombres, en la que no se resuelven los nombres de los objetos hasta la ejecución. En este ejemplo, se ejecutaron y confirmaron las dos primeras instrucciones INSERT y las dos filas permanecen en la tabla TestBatch después de que la tercera instrucción INSERT generara un error en tiempo de ejecución al hacer referencia a una tabla que no existe.
USE AdventureWorks;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBch VALUES (3, 'ccc'); -- Table name error.
GO
SELECT * FROM TestBatch -- Returns rows 1 and 2.
GO