2009-03-29 27 views

Respuesta

94

Para agregar a las otras respuestas, sp_lock también se puede utilizar para volcar la información de bloqueo completo en todos los procesos en ejecución. El resultado puede ser abrumador, pero si quiere saber exactamente qué está bloqueado, es valioso ejecutarlo. Usualmente lo uso junto con sp_who2 para enfocarme rápidamente en problemas de bloqueo.

Existen múltiples versiones diferentes de procedimientos "más amigables" sp_lock disponibles en línea, dependiendo de la versión de SQL Server en cuestión.

En su caso, para SQL Server 2005, sp_lock sigue estando disponible, pero obsoleto, por lo que ahora se recomienda utilizar la vista sys.dm_tran_locks para este tipo de cosas. Puede encontrar un ejemplo de cómo "rodar su propio" función sp_lock here.

80

esto no es exactamente lo que muestra que las filas están bloqueadas, pero esto puede útil para usted.

Puede comprobar qué declaraciones se bloqueó mediante la ejecución de esto:

select cmd,* from sys.sysprocesses 
where blocked > 0 

sino que también le dirá lo que cada bloque está esperando. Para que pueda rastrear todo el camino hacia arriba para ver qué enunciado causó el primer bloque que causó los otros bloques.

Editar para añadir comentarios de @MikeBlandford:

La columna bloqueado indica que el SPID del proceso de bloqueo. Puede ejecutar kill {spid} para arreglarlo.

+7

La columna bloqueada indica el spid del proceso de bloqueo. Puede ejecutar kill {spid} para arreglarlo. –

16

También puede usar el procedimiento almacenado sp_who2 incorporado para obtener los procesos bloqueados y bloqueados actuales en una instancia de SQL Server. Normalmente, ejecutaría esto junto con una instancia de SQL Profiler para buscar un proceso de bloqueo y observar el comando más reciente que spid emitió en Profiler.

28

Uso una vista de administración dinámica (DMV) para capturar bloqueos, así como el object_id o partition_id del elemento que está bloqueado.

(debe cambiar a la base de datos que desea observar para obtener object_id)

SELECT 
    TL.resource_type, 
    TL.resource_database_id, 
    TL.resource_associated_entity_id, 
    TL.request_mode, 
    TL.request_session_id, 
    WT.blocking_session_id, 
    O.name AS [object name], 
    O.type_desc AS [object descr], 
    P.partition_id AS [partition id], 
    P.rows AS [partition/page rows], 
    AU.type_desc AS [index descr], 
    AU.container_id AS [index/page container_id] 
FROM sys.dm_tran_locks AS TL 
INNER JOIN sys.dm_os_waiting_tasks AS WT 
ON TL.lock_owner_address = WT.resource_address 
LEFT OUTER JOIN sys.objects AS O 
ON O.object_id = TL.resource_associated_entity_id 
LEFT OUTER JOIN sys.partitions AS P 
ON P.hobt_id = TL.resource_associated_entity_id 
LEFT OUTER JOIN sys.allocation_units AS AU 
ON AU.allocation_unit_id = TL.resource_associated_entity_id; 
+0

Estoy tratando de usar esta declaración para descubrir los objetos que está esperando un proceso. Puedo ver claramente una sesión esperando otra usando 'sp_who2' y en' sys.dm_os_waiting_task' (ambas tratando de actualizar la misma tabla). Pero su extracto no devuelve ninguna fila. ¿Algunas ideas? –

18

puede encontrar actuales cerraduras en su mesa siguiendo consulta.

USE yourdatabase; 
GO 

SELECT * FROM sys.dm_tran_locks 
    WHERE resource_database_id = DB_ID() 
    AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename'); 

Ver sys.dm_tran_locks

Si existen múltiples instancias de la misma request_owner_type, la request_owner_id columna se utiliza para distinguir cada instancia.Para las transacciones distribuidas, las columnas request_owner_type y request_owner_guid mostrarán la información de la entidad diferente.

Por ejemplo, la sesión S1 posee un bloqueo compartido en la Tabla1; y la transacción T1, que se ejecuta bajo la sesión S1, también posee un bloqueo compartido en la Tabla1. En este caso, la columna resource_description devuelta por sys.dm_tran_locks mostrará dos instancias del mismo recurso. La columna request_owner_type mostrará una instancia como sesión y la otra como transacción. Además, la columna resource_owner_id tendrá valores diferentes.

Cuestiones relacionadas