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í:

SET ANSI_DEFAULTS ON

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.

Published 3/11/2007 23:51 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/11/03/manejo-de-transacciones-impl-237-ticas-en-sql-server.aspx

Comentarios

# 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

Sunday, November 04, 2007 3:28 PM por Percy Reyes's SQLWebLog @ ComunidadesAndinas.com

# 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,...

Sunday, November 04, 2007 3:31 PM por Percy Reyes's SQLWebLog @ 3DevNet.com

# 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

Monday, November 05, 2007 9:11 AM por Percy Reyes's SQLWebLog @ ComunidadesAndinas.com

# re: Manejo de Transacciones Implíticas en SQL Server

es muy explicito en su tema

Monday, May 25, 2009 2:32 AM por danya tatiana

# re: Manejo de Transacciones Implíticas en SQL Server

Hola, se me daba este caso.

estoy con Sql Server 2000 y el analizador de  consultas exclusivamente.

En el Analizador de consultas hago lo siguiente:

CREATE TABLE Test (Columna int PRIMARY KEY)

begin tran t1

save tran t1

select @@ERROR, @@ROWCOUNT, @@TRANCOUNT --  @@TRANCOUNT vale 1

INSERT INTO Test VALUES (1xx)

--Servidor: mensaje 170, nivel 15, estado 1, línea 1

--Línea 1: sintaxis incorrecta cerca de 'xx'.

select @@ERROR, @@ROWCOUNT, @@TRANCOUNT --  @@TRANCOUNT vale 1

INSERT INTO Test VALUES ('1xx')

--Servidor: mensaje 245, nivel 16, estado 1, línea 1

--Error de sintaxis al convertir el valor varchar '1xx' para una columna de

tipo de datos int.

select @@ERROR, @@ROWCOUNT, @@TRANCOUNT --  @@TRANCOUNT vale 0 !!!!!!

rollback tran t1 -- Falla si  @@TRANCOUNT vale 0

commit tran -- Falla si  @@TRANCOUNT vale 0

select @@ERROR, @@ROWCOUNT, @@TRANCOUNT --  @@TRANCOUNT vale 0

SELECT * FROM Test

DROP TABLE Test

Tengo dos Inserts dentro de una transacción. Los dos inserts fallan. El

último me cancela la transacción al fallar, TRANCOUNT pasa de 1 a 0 !!!

INSERT INTO Test VALUES (1xx)

--Servidor: mensaje 170, nivel 15, estado 1, línea 1

--Línea 1: sintaxis incorrecta cerca de 'xx'.

Para este Insert, después de su ejecución, TRANCOUNT sigue valiendo 1

INSERT INTO Test VALUES ('1xx')

--Servidor: mensaje 245, nivel 16, estado 1, línea 1

--Error de sintaxis al convertir el valor varchar '1xx' para una columna de

tipo de datos int.

Para este Insert, después de su ejecución, TRANCOUNT pasa a valer 0 !!!

No entiendo el porqué... alguien puede aclararme, estoy desesperado...

Creo que SQL Server no se comporta o trata de igual manera todos los errores.

Según A.Mesa, "Existe un grupo para el cual SQL Server aborta la transaccion, si esta existe. Es por eso que se debe usar @@TRANCOUNT o la funcion XACT_STATE(), en

dependencia si tienes prendida la opcion SET XACT_ABORT, para comprobar antes

de usar COMMIT o ROLLBACK."

IF @@TRANCOUNT > 0

  ROLLBACK TRANSACTION

Cómo saber qué instrucciones de Sql Server, para las cuales SQL Server aborta la transaccion.

Qué devolvería XACT_STATE() en esos casos ? y cómo comprobar que SET XACT_ABORT está activa ?

Gracias a todos.

Thursday, January 07, 2010 9:13 AM por preguntoncojonero

# re: Manejo de Transacciones Implíticas en SQL Server

htttp://www.decasasyautos.com utiliza MySQL para sus comunicaciones.

Saturday, June 05, 2010 11:13 PM por DeCasasyAutos.com