Skip to content

Reducir deadlock en SQL Server

Hemos explicado en un artículo anterior el concepto general respecto a Qué es un Deadlock, pero es posible que aún tengas la duda de cómo realmente se debe reaccionar ante su aparición. Como ya lo dije, lo más importante es la identificación del inicio del problema y posteriormente debemos apuntar a reducir la aparición de deadlock en SQL Server.

Si no has visto aún el artículo de Cómo simular un deadlock en SQL Server, te recomiendo que lo veas en el enlace ya que quiero resaltarte algo particular en ese escenario.


Orden de acceso a los recursos

Fíjate bien el ejemplo y en lo que señalan las líneas.

reducir-deadlock-en-sql-server
Atención a las actualizaciones cruzadas

Durante la ejecución de las dos sesiones, puede verse claramente que el orden de acceso a las tablas es opuesto en ambos casos. Aquí tenemos un escenario perfecto para que suceda un error de deadlock.

La primera sesión (Session A) inicia con la protección del primer recurso colocando un lock sobre la tabla BF_Pablo. La segunda sesión (Session B) inicia protegiendo la tabla BF_Scarlett también generando un lock. Cuando ambas transacciones quieren ir a ejecutar su segunda operación, se encuentran con el lock correspondiente y ya no pueden continuar.

Si quieres ver más acerca de Qué es un bloqueo o ver en más detalle Qué locks genera una conexión puedes visitar los enlaces.


¿Entonces el orden importa?

Claramente podemos ver que sí.

A veces pasa desapercibido este escenario, más aún cuando los sistemas para los cuales se desarrolla código TSQL son de tamaños medianos y grandes.

Otro factor muy importantes que debes tener en cuenta es que los manejadores de código o estos entornos que generan el código TSQL de manera automática (como el Entity Framework), suelen acceder a los objetos en diferente órden de acuerdo a las operaciones que se hacen. Este es un punto clave para validar con el equipo de Desarrollo y evitar estos problemas.


¿Qué otras alternativas tengo para reducir deadlock en SQL Server?

Volvamos al concepto del error. Para que suceda deben estar involucrados al menos dos recursos. Mientras más recursos, mayor probabilidad de aparición.

Entonces reduzcamos el acceso a diferentes recursos.

Usualmente esto requiere cambiar el código de los programas o cambiar la lógica de actualizaciones de objetos. Sin embargo hay una buena alternativa con la creación de índices en las tablas.

Si logramos encontrar los índices adecuados, el lock que se genera en los recursos será más pequeño, y claro, de menor duración. Esto ayudará también a reducir los deadlocks en nuestro servidor.

No te olvides la importancia del monitoreo que nos obliga a la identificación del origen de los errores. Puedes usar nuestra herramienta de monitoreo de deadlocks en SQL Server.

Más detalles en nuestras webinars y futuras publicaciones. Para enterarte de ellos regístrate en este enlace para recibir el boletín de noticias.

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Carrito
Volver arriba