Manejo de Transacciones Implíticas en SQL Server
Uno de los modos de transacciones que se conocen, aparte de las transacciones auto-commit y las explícitas, son las Transacciones Implícitas que son aquellas iniciadas por SQL Server en el caso de que no exista alguna transacción. Las transacciones implícitas no llegan a realizar un COMMIT o ROLLBACK automáticamente, siendo necesario finalizarlo explicitamente. Esto es útil cuando deseamos iniciar automáticamente las transacciones e ir administrando y evaluando la confirmación o cancelación de las mismas. Por defecto, SQL Server maneja las transacciones en modo auto-commit, es decir, en este modo SQL server inicia y termina automáticamente una transacción cuando esta no ha sido definida por el desarrollador.
En fin, una transacción implícita cuando no existen transacciones se inician con las siguientes sentencias: ALTER TABLE, CREATE, DROP, GRANT, REVOKE, OPEN, FECTH, INSERT, UPDATE, DELETE, SELECT, TRUNCATE TABLE. Para usar las transacciones implícitas debe ajustarse la conexión para que trabaje en este modo.
SET IMPLICIT_TRANSACTIONS ON;
Otra manera de ajustar a modo implícito, sería activar la opción ANSI_DEFAULTS, con esto el modo de transacción implícita también se activará. Así:
Vamos a ejecutar el siguiente código y checkear si la transacción es iniciada.
CREATE TABLE [Customers](
[CustomerID] [nchar](5) NOT NULL,
[CompanyName] [nvarchar](40) NOT NULL,
[ContactName] [nvarchar](30) NULL,
[ContactTitle] [nvarchar](30) NULL,
[Address] [nvarchar](60) NULL,
[City] [nvarchar](15) NULL,
[Region] [nvarchar](15) NULL,
[PostalCode] [nvarchar](10) NULL,
[Country] [nvarchar](15) NULL,
[Phone] [nvarchar](24) NULL,
[Fax] [nvarchar](24) NULL,
CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ([CustomerID])
)
Ahora se necesita evaluar si alguna transacción activa asociada a la conexión actual, para esto consultaremos el valor de @@TRANCOUNT.
SELECT @@TRANCOUNT AS [TranCount];
Vemos que el resultado indicará que hay una transacción iniciada. Bien, hasa ahora aún no hemos cerrado la transacción anterior, entonces el siguiente código se ejecutará dentro de dicha transacción.
INSERT INTO [Customers]
VALUES
(
'APRPS',
'HILARION-Abastos',
'Percy Reyes',
'Sales Representative',
'Obere Str. 57',
'Berlin',
NULL,
'12209',
'Germany',
'030-0074321',
'030-0076545'
)
Ejecute el siguiente código para comprobar que el número de transacciones sigue siendo 1.
SELECT @@TRANCOUNT AS [TranCount];
Finalmente hacemos un ROLLBACK TRAN (ó un COMMIT TRAN), y pasamos a evaluar el valor de @@TRANCOUNT (como se a venido haciendo) para comprobar que el número de transacciones activas ahora es cero.
ROLLBACK TRAN
GO
SELECT @@TRANCOUNT AS [TranCount];
Entonces, como hemos hecho un ROLLBACK TRAN, no debe existir la tabla Customers que se pretendió crear al inicio. Para comprobarlo puede hacer un simple SELECT a la tabla, y SQL Server Engine le devolverá un error indicándole que no existe dicha tabla.
Por último, la volver a modo auto-commit, haga lo siguiente:
SET IMPLICIT_TRANSACTIONS OFF;
Cuando estemos trabajando con transacciones implícitas podría darse el caso de que en algún momento olvidemos de hacer el COMMIT TRAN correspondiente originando más adelante transacciones grandes, y posiblemente provocando bloqueos con otras conexiones, o teniedo ROLLBACKs indeseados debido a conexiones cerradas. Se recomienda no olvidar realizar el COMMIT TRAN o ROLLBACK TRAN cuando trabaje en este modo.