El día de hoy vamos a continuar con nuestro mini tutorial de las transacciones y los problemas que pueden darnos.
En el post de ayer veíamos el comando DBCC, este nos daba un id de la sesión en la cual se está corriendo la transacción que se “quedo” abierta, así que ahora vamos a irnos a nuestro activity monitor y ahí buscamos la línea que tenga como id el que nos regreso el DBCC.
BEGIN TRAN
INSERT INTO TABLA1(nombre,descripcion)
VALUES('Un nombre','Una descripcion')
DBCC OPENTRAN
(1 row(s) affected)
Transaction information for database 'pruebas'.
Oldest active transaction:
SPID (server process ID): 54
UID (user ID) : -1
Name : user_transaction
LSN : (19:486:26)
Start time : Jun 8 2009 8:42:47:527PM
SID : 0x01
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Y ya de aquí matamos la transacción latosa y listo, ya no tendremos bloqueo, pero nuestro problema sigue ahí, así que haremos uso de un pequeño hint de nombre “NOLOCK” el cual le dice al sql algo como: “no bloquees toda la tabla durante una transacción”. Veamos un ejemplo:
-- de nuevo la transaccion mortal
BEGIN TRAN
INSERT INTO TABLA1(nombre,descripcion)
VALUES('Un nombre','Una descripcion')
Y en otra ventana del SSMS:
select * from tabla1 with (nolock)
En esta ocasion si funcionara como se esperaba .
Este hint hace que las consultas sean un poco mas lentas cuando se tiene poca concurrencia, pero en casos mas graves puede ser la salvacion.