Hay muchas razones por las que las aplicaciones pueden tardar en responder, pero si los usuarios se quejan del rendimiento, es posible que esté lidiando con un punto muerto de SQL Server. Afortunadamente, existen formas de identificar y corregir el interbloqueo de SQL Server, e incluso evitar que afecte negativamente el rendimiento de la aplicación.
El interbloqueo de SQL Server es esencialmente un enfrentamiento entre dos procesos que compiten por el acceso exclusivo al mismo recurso. Debido a que solo un proceso puede usar un recurso a la vez, el rendimiento se ralentiza hasta que se resuelve el interbloqueo.
Hay dos tipos de interbloqueos de SQL Server a tener en cuenta:bloqueos de conversión y bloqueos de ciclo.
Los interbloqueos de bloqueo de conversión ocurren cuando un subproceso intenta convertir un bloqueo de un tipo exclusivo a otro tipo exclusivo, pero no puede porque un subproceso diferente ya tiene un bloqueo compartido en el recurso que el primer subproceso está tratando de convertir.
En SQL Server, hay tres tipos de bloqueos de conversión:
- Compartido con intención exclusiva (SIX):este bloqueo se produce cuando una transacción que tiene un bloqueo compartido también tiene un bloqueo exclusivo en algunas páginas o filas.
- Shared with intent update (SIU):este bloqueo se produce cuando una transacción que tiene un bloqueo compartido también tiene algunas páginas o filas bloqueadas con un bloqueo de actualización.
- Actualizar con intención exclusiva (UIX):este bloqueo se produce cuando una transacción que tiene un bloqueo de actualización también tiene un bloqueo exclusivo en algunas páginas o filas.
Los bloqueos de ciclo son interbloqueos de SQL Server causados por dos procesos que compiten por un bloqueo exclusivo en un recurso que está bloqueado por el otro proceso.
Por ejemplo, el Proceso 1 mantiene un bloqueo en el Recurso 1 mientras espera que el Proceso 2 libere su bloqueo en el Recurso 2. Si el Proceso 2 mantiene un bloqueo en el Recurso 2 mientras espera que el Proceso 1 libere el Recurso 1, tenemos un interbloqueo de bloqueo de ciclo.
Cómo diagnosticar un punto muerto de SQL Server
El interbloqueo de SQL Server es solo una de las docenas de razones posibles por las que su aplicación puede tener problemas de rendimiento. Si las consultas que normalmente se ejecutan rápidamente se ralentizan repentinamente, es posible que tenga un punto muerto. Pero también es posible que algo más esté pasando.
Entonces, además de notar una velocidad de consulta reducida, ¿cómo determina con certeza si el interbloqueo es el culpable de los problemas de rendimiento de su base de datos?
La forma más sencilla y definitiva de identificar interbloqueos es la presencia de un mensaje de error 1205:
La transacción (Id. de proceso %d) se interbloqueó en %.*ls recursos con otro proceso y se eligió como víctima del interbloqueo. Vuelva a ejecutar la transacción.
El mensaje de error 1205 literalmente le dice que hay un punto muerto y cómo solucionarlo. Sin embargo, como señala Jeremiah Peschka, si no ha solucionado la causa del interbloqueo, es probable que volver a ejecutar la transacción no tenga éxito.
Otra opción para encontrar puntos muertos es extraer un gráfico de puntos muertos de SQL Server de Extended Events. Extraer el interbloqueo a través de Extended Events le permite ver el XML de interbloqueo, que proporciona más información que la representación gráfica de un gráfico de interbloqueo.
El XML de punto muerto está organizado por la lista de víctimas, la lista de procesos y la lista de recursos. Cada sección brinda descripciones detalladas de las víctimas, los procesos y los recursos involucrados en el interbloqueo, lo que facilita la solución de problemas y la resolución del problema.
Cómo solucionar el punto muerto de SQL Server
La única forma de resolver un interbloqueo de SQL Server es terminar uno de los procesos y liberar el recurso bloqueado para que el proceso pueda completarse. Esto ocurre automáticamente cuando SQL Server detecta un interbloqueo y elimina uno de los procesos de la competencia (es decir, la víctima).
SQL Server normalmente elige qué conexión eliminar al azar, pero es posible establecer prioridades de punto muerto para determinar qué conexión se elimina durante un punto muerto. Cuando dos conexiones tienen diferentes configuraciones de prioridad, SQL Server eliminará la transacción con la prioridad más baja.
Cómo evitar el interbloqueo de SQL Server
El interbloqueo de SQL Server es una realidad cuando administra una base de datos ocupada. Sin embargo, los DBA pueden ayudar a reducir la aparición de interbloqueos y minimizar su impacto en el rendimiento de la base de datos tomando algunas medidas preventivas:
- Crear mejores índices
- Ajustar las prioridades de transacción
- Promulgar un modelo Try/Retry
- Cambiar los modos de aislamiento
- Mantenga los bloqueos durante el menor tiempo posible
- Acceda a los recursos en el mismo orden cada vez
- No envíe una transacción hasta que tenga toda la información que necesita
- Limitar la escalada de bloqueo
Aunque no es posible evitar por completo el interbloqueo de SQL Server, puede implementar estas prácticas recomendadas y eludir proactivamente algunas de las fuentes más comunes de interbloqueo para que las transacciones fluyan sin problemas y optimice el rendimiento de la base de datos.