Bloqueo de transacción para seleccionar consulta


De vez en cuando, tengo el siguiente error para un procedimiento almacenado que es solo una consulta Select: Transaction (Process ID 91) was deadlocked on lock

Mi comprensión inicial fue que una consulta select no bloqueará una tabla, o no causará un bloqueo incluso si la tabla que intenta consultar está siendo actualizada/bloqueada por otro proceso, pero parece que una consulta select también puede causar bloqueos.

Si establezco el nivel de aislamiento para leer sin confirmar para la consulta, ¿resolverá el problema?

Author: Elias Mårtenson, 2011-04-29

3 answers

Mi comprensión inicial es que un Select la consulta no bloqueará una tabla, o no causar un punto muerto

Este entendimiento es erróneo. 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 update/delete/insert. Dos sentencias SELECT no van a deadlock, pero una SELECT puede deadlock con una ACTUALIZACIÓN. Cuando se produce tal bloqueo, el SELECT suele ser la víctima, ya que no realizó ninguna actualización, por lo que siempre va para perder el empate.

Al igual que con cualquier punto muerto, debe publicar el esquema exacto de las tablas involucradas, las instrucciones T-SQL exactas y el gráfico de punto muerto. Vea Cómo: Guardar gráficos de punto muerto (SQL Server Profiler). Con esta información puede recibir orientación sobre cómo solucionar el punto muerto.

 39
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 00:57:10

Como Remus dice, usted está recibiendo los bloqueos porque SELECCIONAR y ACTUALIZAR (u otras) operaciones de bloqueo entre sí, no SELECCIONAR vs SELECCIONAR. Tendrá que mirar todas sus consultas tocando esa tabla y crear índices de cobertura adecuados para esas consultas y eso resolverá sus problemas. Buenos índices de cobertura es la solución preferida en lugar de usar con sugerencias de tabla (NOLOCK).

Vea el siguiente enlace para un buen tutorial sobre cómo crear índices de cobertura y cómo afecta a los puntos muertos.

 5
Author: Ghlouw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-08 09:24:34

Si está utilizando SQL Server 2008, puede establecer el nivel de aislamiento para leer no comprometido para evitar el bloqueo. Ver este enlace . Al leer uncommitted o CON (NOLOCK) uno debe ser consciente de que los datos retruned por la consulta puede no ser REAL!

 4
Author: RC_Cleland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 01:24:11