Sidebar

En nuestros ambientes de SQL Server siempre se presentan los bloqueos, y esto es algo normal ya que es la manera que tiene SQL Server de mantener la integridad de nuestros datos. El problema viene cuando este bloqueo dura más de lo esperado, provocando que nuestras aplicaciones comiencen a experimentar problemas de desempeño. ¿ Cómo podemos encontrar quien está bloqueando la aplicación?

Voy a mostrar dos maneras de encontrar un bloqueo utilizando comandos.

sys.dm_exec_requests

La vista dinámica sys.dm_exec_requests muestra el detalle de todos los procesos ejecutandose en SQL Server. Si lo filtramos por la columna blocking_session_id podemos obtener el proceso que esta bloqueando a otros usuarios.

Muestra la sesión que esta generando el bloqueo.

USE master
GO
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id <> 0;
GO

Sobre esta misma vista podemos ver las víctimas de esta bloqueo, es decir aquellos usuarios que están esperando poder utilizar este recurso.

El siguiente comando nos muestra las sesiones bloqueadas.

USE master
GO
SELECT session_id ,status ,blocking_session_id,
wait_type ,wait_time ,wait_resource ,transaction_id
FROM sys.dm_exec_requests WHERE status = N'suspended';
GO

sys.dm_os_waiting_tasks

Esta vista dinámica muestra las tareas que están esperando por algún recurso.

USE master
GO
SELECT session_id, wait_duration_ms, wait_type, blocking_session_id
FROM sys.dm_os_waiting_tasks WHERE blocking_session_id <> 0
GO
Esto es todo lo que requieres para poder encontrar el causante del bloqueo.

Para poder realizar la consulta sobre estas tablas dinámicas, es necesario que se tenga el permiso "VIEW SERVER STATE" o ser administrador de la base de datos.


Tips BD