2011-04-29 12 views
20

De vez en cuando, tengo el siguiente error para un procedimiento almacenado que sólo es una consulta de selección: Transaction (Process ID 91) was deadlocked on lockestancamiento transacción para consulta de selección

Mi comprensión inicial era que una consulta de selección no va a bloquear una tabla, o no lo hará causa un interbloqueo incluso si la tabla que intenta consultar está siendo actualizada/bloqueada por otro proceso, pero parece que una consulta de selección también puede causar interbloqueos.

Si configuro el nivel de aislamiento para leer no confirmado para la consulta, ¿eso resolverá el problema?

+0

por favor muestre la consulta. –

Respuesta

38

Mi entendimiento es que init a Seleccione consulta no se bloqueará una mesa, o no quiere causa un punto muerto

Este entendimiento es incorrecto. 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.

Como con cualquier interbloqueo, debe publicar el esquema exacto de las tablas involucradas, las instrucciones T-SQL exactas y el gráfico de interbloqueo. Ver How to: Save Deadlock Graphs (SQL Server Profiler). Con esta información, puede recibir orientación sobre cómo solucionar el punto muerto.

+0

Gracias, esto tiene sentido. – peanut

+0

@Remus Rusanu En realidad, dos sentencias seleccionadas pueden estancarse. Consulte https://dba.stackexchange.com/questions/152768/seeing-2-exclusive-locks-on-the-same-index-is-this-possible. ¿Puedes explicar eso? – kolobok

+0

@kolobok por favor haga preguntas como preguntas separadas y no como comentarios. Publica aquí el enlace a la pregunta. –

4

Si está utilizando SQL Server 2008 puede establecer el nivel de aislamiento para leer no confirmado para evitar el interbloqueo. Vea esto link. Al leer no confirmado o CON (NOLOCK) uno debe saber que los datos devueltos por la consulta pueden no ser REALES.

5

Como dice Remus, está obteniendo los bloqueos porque las operaciones SELECT y UPDATE (u otras) se bloquean 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 link para obtener un buen tutorial sobre cómo crear índices de cobertura y cómo afecta a los interbloqueos.

Cuestiones relacionadas