El TecnoBaúl de Kiquenet

Kiquenet boring stories

El maravilloso mundo de las Transacciones II

Posted by kiquenet en 18 septiembre 2010

En el analizador de consultas de SQL SERVER:

begin tran

select * from CORC_TEMP_COMPROMISOS where it_accion = ‘M’
select @@trancount

select * from CORC_TEMP_COMPROMISOS where it_accion = ‘A’
select @@trancount

Insert into CORC_COMPROMISOS (cd_linea_financiera, cd_asociacion,
cd_accion, nm_grupos, nm_participantes)
values ( ‘5’,’0001′,33,33,33)
— falla por triggers , es indiferente para el commit/rollbak de la transacción

select @@trancount — aqui vale 0 !!!!!!!!!! DEBERIA VALER 1 !!!!!
commit tran

Es responsabilidad del programador de Transact-SQL utilizar COMMIT
TRANSACTION sólo en el punto donde todos los datos a los que hace referencia la transacción sean lógicamente correctos.

Si la transacción que se ha confirmado era una transacción Transact-SQL
distribuida, COMMIT TRANSACTION hace que MS DTC utilice el protocolo de confirmación en dos fases para enviar confirmaciones a los servidores
involucrados en la transacción. Si una transacción local afecta a dos o más
bases de datos del mismo servidor, SQL Server utiliza una confirmación
interna en dos fases para confirmar todas las bases de datos involucradas en la transacción.

Cuando se utiliza en transacciones anidadas, las confirmaciones de las transacciones anidadas no liberan recursos ni hacen permanentes sus modificaciones.

Las modificaciones sobre los datos sólo quedan permanentes y se liberan los recursos cuando se confirma la transacción más externa.

Cada COMMIT TRANSACTION que se ejecute cuando @@TRANCOUNT sea mayor que 1 sólo reduce @@TRANCOUNT en 1.

Cuando @@TRANCOUNT llega a 0, se confirma la transacción externa entera. Como SQL Server omite transaction_name, la ejecución de una instrucción COMMIT TRANSACTION que haga referencia al nombre de una transacción externa cuando haya transacciones anidadas pendientes sólo reduce @@TRANCOUNT en 1.

La ejecución de COMMIT TRANSACTION cuando @@TRANCOUNT es 0 produce un error que indica que no hay ninguna instrucción BEGIN TRANSACTION asociada.

No se puede cancelar una transacción después de ejecutar una instrucción
COMMIT TRANSACTION, porque las modificaciones sobre los datos ya son parte permanente de la base de datos.

Este ejemplo utiliza @@TRANCOUNT para comprobar si hay transacciones
abiertas que haya que confirmar.

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = ‘White’

IF @@ROWCOUNT = 2
COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
PRINT ‘A transaction needs to be rolled back’
ROLLBACK TRAN
END

Fuentes: V.Popov (Foros Microsoft)

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: