¿Cómo podemos verificar qué bloqueos de la base de datos se aplican en qué filas en un lote de consulta?
¿Alguna herramienta que resalte el bloqueo de nivel de fila de la tabla en tiempo real?
DB: SQL Server 2005
fuente
¿Cómo podemos verificar qué bloqueos de la base de datos se aplican en qué filas en un lote de consulta?
¿Alguna herramienta que resalte el bloqueo de nivel de fila de la tabla en tiempo real?
DB: SQL Server 2005
Para agregar a las otras respuestas, sp_lock
también se puede usar para volcar la información de bloqueo completo en todos los procesos en ejecución. El resultado puede ser abrumador, pero si desea saber exactamente qué está bloqueado, es valioso ejecutarlo. Por lo general, lo uso junto con sp_who2
para concentrarse rápidamente en los problemas de bloqueo.
Existen múltiples versiones diferentes de sp_lock
procedimientos "más amigables" disponibles en línea, dependiendo de la versión de SQL Server en cuestión.
En su caso, para SQL Server 2005, sp_lock
todavía está disponible, pero en desuso, por lo que ahora se recomienda usar la sys.dm_tran_locks
vista para este tipo de cosas. Puede encontrar un ejemplo de cómo "rodar su propia" función sp_lock aquí .
Esto no le muestra exactamente qué filas están bloqueadas, pero esto puede serle útil.
Puede verificar qué declaraciones están bloqueadas ejecutando esto:
select cmd,* from sys.sysprocesses
where blocked > 0
También le dirá qué espera cada bloque. Por lo tanto, puede rastrearlo hasta arriba para ver qué enunciado causó el primer bloque que causó los otros bloques.
Edite para agregar comentarios de @MikeBlandford :
La columna bloqueada indica el spid del proceso de bloqueo. Puede ejecutar kill {spid} para arreglarlo.
Puede encontrar bloqueos actuales en su tabla siguiendo la consulta.
Ver sys.dm_tran_locks
Si existen varias instancias del mismo tipo request_owner_type , la columna request_owner_id se usa para distinguir cada instancia. Para transacciones distribuidas, request_owner_type y request_owner_guid columnas mostrarán la información de la entidad diferente.
Por ejemplo, la sesión S1 posee un bloqueo compartido en Table1; y la transacción T1, que se ejecuta en la sesión S1, también posee un bloqueo compartido en la Tabla1. En este caso, la columna resource_description que devuelve 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.
fuente
Utilizo una Vista de gestión dinámica (DMV) para capturar bloqueos, así como el object_id o la parte de partición del elemento que está bloqueado.
(DEBE cambiar a la base de datos que desea observar para obtener object_id)
fuente
sp_who2
y ensys.dm_os_waiting_task
(ambos tratando de actualizar la misma tabla). Pero su declaración no devuelve ninguna fila. ¿Algunas ideas?También puede usar el
sp_who2
procedimiento almacenado incorporado para obtener procesos bloqueados y bloqueantes actuales en una instancia de SQL Server. Por lo general, ejecuta esto junto con una instancia de SQL Profiler para encontrar un proceso de bloqueo y ver el comando más reciente que spid emitió en profiler.fuente
Puede encontrar detalles a través del siguiente script.
fuente