Introducción
En esta serie, proporcionaré toda la información que necesita comprender para lidiar con los puntos muertos o interbloqueos.
En la parte 1 (de este artículo) explicaré:
- La definición de interbloqueo o punto muerto
- Los diferentes tipos de interbloqueos
- Cómo SQL Server maneja los interbloqueos
Definición de interbloqueo o punto muerto
Se produce un interbloqueo cuando 2 procesos compiten por el acceso exclusivo a un recurso, pero no son capaces de poder obtener acceso exclusivo a él, porque el otro proceso lo impide. Esto da como resultado un enfrentamiento donde ninguno de los procesos puede continuar. La única forma de salir del estancamiento o interbloqueo es que uno de los procesos sea concluido. SQL Server detecta automáticamente cuándo se han producido interbloqueos y toma medidas eliminando uno de los procesos conocido como la víctima.
Los interbloqueos no solo ocurren en los bloqueos, del SQL Server 2012 y en adelante, los interbloqueos también pueden ocurrir con la memoria, y los recursos MARS (Conjuntos de resultados activos múltiples), los subprocesos de trabajo y los recursos relacionados con la ejecución de consultas paralelas.
¿Cómo sé si tengo un interbloqueo?
El primer síntoma que tendrá de un interbloqueo es el siguiente mensaje de error que se mostrará en pantalla al usuario propietario del proceso que fue seleccionado como víctima del interbloqueo.
Msg 1205, Nivel 13, Estado 51, Línea 6
Transacción (ID de proceso 62) se bloqueó en los recursos de bloqueo con otro proceso y se ha elegido como víctima de bloqueo. Vuelva a ejecutar la transacción.
El otro usuario cuyo proceso no fue seleccionado como víctima, probablemente pasará desapercibido y además ignorará por completo que su proceso participó en un interbloqueo.
Tipos de definiciones de interbloqueos
Hay 2 tipos diferentes de interbloqueos.
Definición de bloqueo de ciclo
Un ciclo de interbloqueo sucede cuando un proceso A que mantiene un bloqueo en el recurso X espera obtener un bloqueo exclusivo en el recurso Y, mientras que al mismo tiempo el proceso B mantiene un bloqueo en el recurso Y y espera obtener un bloqueo exclusivo bloquear el recurso X.
La conversión bloquea la definición de interbloqueo
Una conversión de interbloqueo Se produce cuando un subproceso intenta convertir un bloqueo de un tipo a otro tipo exclusivo, pero no puede hacerlo porque otro subproceso ya tiene un bloqueo compartido en el mismo recurso.
Hay 3 tipos de bloqueos de conversiones en SQL Server.
Tipo | Nombre | Descripción |
SIU | Compartir con intento de actualización | El hilo toma algunos de los bloqueos compartidos, pero también tiene actualizaciones en lob bloqueos en algunos componentes (página o fila). |
SIX | Compartir con intento Exclusivo | El hilo incluye un bloqueo compartido y un bloqueo exclusive en algunos componentes (página o fila). |
UIX | Actualización con Intento Exclusivo | El bloqueo U y el bloqueo IX son usados de manera separada, pero son utilizados al mismo tiempo. |
Cómo SQL Server maneja los interbloqueos
El administrador de bloqueos en SQL Server busca automáticamente los interbloqueos, este hilo conductor que se llama LOCK_MONITOR busca interbloqueos cada 5 segundos. Mira todos los bloqueos que se hallan en espera para determinar si hay ciclos. Cuando detecta un interbloqueo, elige una de las transacciones como víctima y envía un error 1205 al cliente que posee la conexión. Entonces esta transacción se termina y se revierte, lo que libera todos los recursos en los que se mantuvo un bloqueo, permitiendo que se continúe con la otra transacción involucrada en el interbloqueo.
Si hay muchos interbloqueos, SQL Server ajusta automáticamente la frecuencia de la búsqueda de interbloqueos y los respalda cada 5 segundos si los interbloqueos ya no son tan frecuentes.
¿Cómo elige SQL Server a la víctima?
Hay un par de factores que entran en juego aquí. El primero es la prioridad de interbloqueo. La prioridad de interbloqueo de una transacción se puede establecer con el siguiente comando:
1 2 3 |
SET DEADLOCK_PRIORITY LOW; |
Los valores típicos para la prioridad de interbloqueo son:
Prioridad | Valor | Resultado |
BAJO | -5 | Si otras transacciones tienen una prioridad de NORMAL o ALTA o numéricamente más alta que -5, esta transacción se elegirá como la víctima del punto muerto |
NORMAL | 0 | Esta es la prioridad predeterminada. La transacción podría elegirse como víctima si otras transacciones tienen una prioridad superior a 0. |
ALTO | 5 | Este proceso no se seleccionará como víctima a menos que haya un proceso con una prioridad numérica superior a 5. |
<numérico> | -10 to 10 | Esto se puede utilizar para gestionar la prioridad del interbloqueo en un nivel más granular |
Si las transacciones involucradas en un interbloqueo tienen la misma prioridad de interbloqueo, la prioridad que se revierte es la que tiene el costo más bajo. En el ejemplo en el que se ha utilizado es la que tiene menor cantidad de registro de transacciones, lo que indica que hay menos datos para revertir.
Haciendo seguimiento de los interbloqueos
Hay una serie de varias herramientas que se pueden utilizar para obtener los detalles de interbloqueos. Estos incluyen indicadores de traza 1204 y 1222. Usted también puede capturar el evento de gráfico de interbloqueo utilizando SQL Profiler.
Personalmente, yo encuentro que cuando sospecho que se está produciendo un bloqueo en mi servidor, encuentro que la configuración y la sesión de eventos extendida para registrar el gráfico de bloqueo cada vez que esta ocurre es la más fácil.
Desde SQL Server 2012 en adelante, esto se puede hacer en SQL Server Management Studio en Management\Extended Events:
Al usar eventos extendidos, usted podrá ver con bastante facilidad con qué frecuencia se producen interbloqueos en su base de datos e inmediatamente usted tendrá disponible el gráfico de interbloqueo en el que se muestra cada interbloqueo que se produjo con el fin de ayudarlo a resolverlo el mismo.
Cómo minimizar los interbloqueos
Aquí hay un par de consejos para minimizar los interbloqueos
Siempre trate de mantener los bloqueos por el menor tiempo posible
Acceda siempre a los recursos en el mismo orden
Asegúrese de no tener que esperar la entrada del usuario en medio de una transacción. Primero obtenga toda la información que necesita y luego envíe la transacción
Intente limitar la escalada de bloqueo, utilizando sugerencias como ROWLOCK, etc.
Utilice LEER EL AISLAMIENTO INSTANTANEO COMPROMETIDO o LA AISLACIÓN INSTANTÁNEA
Resolviendo los interbloqueos
Resolver los interbloqueos puede ser un asunto complicado y está más allá del alcance de este artículo. Esté atento a mis próximos artículos que explican cómo leer el gráfico de interbloqueo que es el más útil para comprender la causa de su interbloqueo y le dará una idea de cómo abordar un interbloqueo.
Otros artículos en esta serie:
- Comprender la representación gráfica del gráfico de interbloqueo de SQL Server
- Comprender la descripción XML del gráfico Deadlock en SQL Server
- Definición y descripción general interbloqueo de SQL Server - December 16, 2019
- 5 consejos prácticos de Transact-SQL que puede usted conozca (o no) - December 24, 2016
- Creando una estrategia de auditoría exitosa para sus bases de datos SQL Server - October 29, 2016