Suele suceder que cuando un simple y silvestre SELECT en una tabla, el cuál inicia con un BEGIN TRAN pero no tiene un COMMIT respectivo (ya sea por fallos de conexión o codificación del programa…) éste proceso queda “Enllavado” con la tabla, y es cuando al querer hacer querys referentes a ésta tabla se congelan los procesos releativos. ¿Porqué se dá ésto? por lo famosos bloqueos…
Efectivamente, cuando en el SQL Query Analizer ponemos (en la BD master):
sp_who2
Éste comando nos muestra los procesos que son usados y, adicional, en la columna “BlkBy” se muestra el SPID (código del proceso) del proceso que está bloqueando a otro.
EL problema está cuando hay varios bloqueos… Se hace difícil conocer cuál es el proceso que está originando el problema, pero existe un par de comandos que nos ayudará en ésta tarea.
El comando:
DBCC OPENTRAN
Nos muestra el proceso original que está bloqueando el acceso a una tabla, dado que está esperando un COMMIT o algo así, por lo que perfectamente se pueda dar KILL a dicho proceso para solventar el problema así:
KILL [# SPID] –> Ejemplo: Kill 61
Para poder identificar qué query es el que dió el problema, hay que tomar en cuenta antes de hacer el KILL correr el siguiente comando:
DBCC INPUTBUFFER(61)
Donde 61 realmente es el SPID el cuál se detectó mediante DBCC OPENTRAN.
De ésta forma se nos mostrará en el SQL Query Analizer la instrucción sql que está provocando el bloqueo a los demás.