Estoy tratando de solucionar un problema de bloqueo que ocurre por menos de un segundo. La aplicación OLTP es muy sensible y debe tener un tiempo de respuesta de menos de 200 ms para algunas transacciones según el acuerdo de nivel de servicio acordado. Tuvimos algunos problemas de escalada de bloqueo con la nueva versión del código que pudimos resolver reduciendo el tamaño del lote en las actualizaciones. Incluso con el pequeño tamaño de lote, sospechamos que el nuevo sp está bloqueando las mismas filas que las transacciones OLTP están actualizando.
Necesito encontrar la sesión que se está bloqueando y el recurso está esperando. Según mi entendimiento, el "umbral de proceso bloqueado" puede establecerse por un mínimo de 1 segundo, por lo que esto no capturará el bloqueo.
Estoy experimentando con wait_info y wait_completed x eventos.
¿Hay alguna otra forma de rastrear esto? Gracias

Respuestas:
Como está específicamente interesado en bloquear en lugar de esperar en general, el
locks_lock_waitsevento extendido suena más adecuado.Con un filtro encendido
increment >= 200Lo anterior reúne las declaraciones que esperan en los bloqueos durante el umbral de tiempo, pero no proporciona el recurso de bloqueo específico.
Nunca he usado este evento y no tengo idea de cuánto sobrecargaría esta sesión en su servidor de producción.
Encontré este video sobre el tema. Eso recomienda encarecidamente filtrar
counterpara reducir la cantidad de eventos recopilados y lo he hecho anteriormente.También menciona un antiguo comando indocumentado heredado
Que (si el indicador de seguimiento 3605 está habilitado) volca información limitada, como la siguiente, en el registro de errores de SQL Server.
Solo menciono esto de pasada, ya que los eventos extendidos serían claramente preferibles de todos modos, ya que está documentado y es mucho más poderoso.
fuente
dbcc lock(StallReportThreshold, 200)primero y genera la información una vez que se supera el umbral, siempre que el indicador de seguimiento 3605 esté habilitado. SQL Server no recopila esta información en caso de que pueda ejecutarla más tarde.Si está interesado en bloquear, hay varios eventos extendidos disponibles:
Los primeros dos eventos tienen una
durationcolumna en (microsegundos) que puede filtrar para sus umbrales. También tienen unaresource_descriptionacción que le dará algunos detalles sobre los recursos involucrados.El
lock_escalationevento también tiene unastatementacción que puede agregar para recopilar la instrucción T-SQL que desencadenó la escalada de bloqueo. También tieneescalation_cause. Aquí hay una sesión de muestra:Sospecho que probablemente haya una razón por la que no puede establecer el umbral del informe de proceso bloqueado en menos de un segundo: el bloqueo es perfectamente normal en un RDBMS: el motor de la base de datos debe bloquear los recursos para protegerlos. Aunque no existe una definición oficial de cuándo el bloqueo se convierte en bloqueo, el bloqueo del tic-tac en menos de un segundo me parece algo normal.
fuente