tablas - sql bloqueo
Interbloqueo de transacción para consulta de selección (3)
Ocasionalmente, tengo el siguiente error para un procedimiento almacenado que es solo una consulta Select: Transaction (Process ID 91) was deadlocked on lock
Mi entendimiento inicial fue que una consulta de selección no bloqueará una tabla, o no causará un punto muerto, incluso si la tabla que intenta consultar está siendo actualizada / bloqueada por otro proceso, pero parece que una consulta de selección puede causar interbloqueos como bien.
Si configuro el nivel de aislamiento para leer no confirmado para la consulta, ¿eso resolverá el problema?
Mi entendimiento inicial es que una consulta de selección no bloqueará una tabla, o no causará un punto muerto
Esta comprensión es incorrecta. Las consultas SELECT toman bloqueos compartidos en las filas que analizan. Los bloqueos compartidos pueden entrar en conflicto con los bloqueos exclusivos de las instrucciones de actualización / eliminación / inserción. Dos instrucciones SELECT no se estancarán, pero un SELECT puede bloquearse con una ACTUALIZACIÓN. Cuando se produce un punto muerto, el SELECT suele ser la víctima, ya que no realizó ninguna actualización, por lo que siempre va a perder el sorteo.
Al igual que con cualquier interbloqueo, debe publicar el esquema exacto de las tablas involucradas, las instrucciones exactas de T-SQL y el gráfico de interbloqueo. Consulte Cómo guardar: gráficos de interbloqueo (Analizador de SQL Server) . Con esta información, puede recibir orientación sobre cómo solucionar el punto muerto.
Si está utilizando SQL Server 2008, puede configurar el nivel de aislamiento para leer no confirmado para evitar el interbloqueo. Ver este enlace Al leer no confirmado o CON (NOLOCK) uno debe saber que los datos devueltos por la consulta pueden no ser REALES.
Como dice Remus, estás obteniendo los interbloqueos porque las operaciones SELECCIONAR y ACTUALIZAR (u otras) interbloquean entre sí, no SELECCIONAR vs SELECCIONAR. Tendrá que ver todas sus consultas tocando esa tabla y crear índices de cobertura adecuados para esas consultas y eso resolverá sus problemas. Los buenos índices de cobertura son la solución preferida en lugar de utilizar los consejos de mesa de WITH (NOLOCK).
Consulte el siguiente enlace para obtener un buen tutorial sobre cómo crear índices de cobertura y cómo afecta a los interbloqueos.