jueves, 17 de noviembre de 2016

Bloqueo en tablas de SQL Server

La capacidad de detectar bloqueo en SQL Server y en cualquier motor de bases de datos es crucial al momento de realizar tareas, transaccione o procesamiento de datos. Algunas herramientas y programas internamente pueden bloquear (LOCK) una tabla mientras se está editando un registro, tal es el caso del demonio de Genexus, quien tiene una sed por bloquear cada objeto que toca.

Cuando una tabla posee un bloqueo, por ejemplo cuando un procesamiento de información es largo, las consultas de modificación de datos (DML), select, insert, update, no se llevan a cabo hasta tanto este proceso haya terminado, ahora bien, si por alguna casualidad este procesamiento nunca termina, por un bloqueo adicional, o una espera indefinida por obtener otros recursos o porque simplemente falló en la confirmación de la instrucción de finalización del ejectutable, las instrucciones que se realizan sobre la tabla bloqueda puede esperar indefinidamente.

Por estas razones poder detectar los bloqueos y fnalizar el proceso (a nivel del SQL Server) es muy importante para que las demás tareas se puedan ejecutar con normalidad.

Una de las tantas formas de hacerlo es tener una tabla auxiliar, llamada por ejemplo TempLock, dentro de la base de datos que se intenta controlar, aquí el script:

Una vez creada esta tabla, las instrucciones a ejecutar dentro de una ventana de consulta son las siguientes:



Los resultados indicarán todas las tablas bloqueadas, con el spid (identificador del proceso del SQL Server) que está bloqueando dicha tabla:


Una vez identificada la tabla bloqueda que se necesita liberar, lo único que resta es ejecutar la instrucción Kill(spid), donde spid es el número que se encuentra en la columna spid de los resultados anteriores, por ejemplo: Kill (581) "matará" el proceso 581 que se encuentra bloqueando la tabla que es necesario liberar.

No hay comentarios:

Publicar un comentario