2012-01-09 38 views
6

Estoy haciendo esta pregunta porque de vez en cuando me encuentro con un punto muerto que no entiendo.¿Cuándo un punto muerto no es un punto muerto?

Este es el escenario:

procedimiento almacenado que actualiza la tabla A:

UPDATE A 
SET A.Column = @SomeValue 
WHERE A.ID  = @ID 

procedimiento almacenado que se inserta en una tabla temporal #temp:

INSERT INTO #temp (Column1,Column2) 

SELECT B.Column1, A.Column2 

FROM B 

INNER JOIN A 
    ON A.ID = B.ID 

WHERE B.Code IN ('Something','SomethingElse') 

veo que no podía posiblemente sea una espera de bloqueo, pero no veo cómo se produciría un punto muerto, ¿me falta algo obvio?

EDIT:

El SP que he escrito aquí son versiones simplificadas, obviamente, pero yo estoy usando las columnas implicadas. La estructura de ambas tablas sería:

CREATE TABLE A (ID IDENTITY 
        CONSTRAINT PRIMARY KEY, 
       Column VARCHAR (100)) 


CREATE TABLE B (ID IDENTITY 
        CONSTRAINT PRIMARY KEY, 
       Code VARCHAR (100)) 
+3

'update' esperando que 'insert into' termine y' insert into' esperando que' update' termine? ¡Ambos esperando que el otro termine! –

+0

Si tanto la Actualización como el Insertar estaban en contra de la misma tabla, a menos que la instrucción Insert intente establecer un bloqueo exclusivo en TODAS las tablas involucradas y no solo en el #temp uno – Gixonita

+1

http://www.codinghorror.com/blog/2008/ 08/deadlocked.html –

Respuesta

1

Prueba esto ya que sus cerraduras causeing especificar para las mesas de nombrar la sugerencia de tabla y palabras clave:

WITH(NOLOCK) 

Así que algo como esto para su escenario:

INSERT INTO #temp (Column1,Column2) 

    SELECT B.Column1, A.Column2 

FROM B WITH(NOLCOK) 

INNER JOIN A WITH(NOLOCK) 
    ON A.ID = B.ID 

WHERE B.Code IN ('Something','SomethingElse') 

Vea cómo va, entonces.

Puede buscar la sugerencia de la tabla también para el servidor tsql, sql para ver cuál le conviene más. El que especifiqué NOLCOK no causará bloqueos y también omitirá las filas bloqueadas ya que algún otro proceso las está usando, por lo que si no te importa puedes usarlo.

No estoy seguro con las tablas temporales, pero también puede usar las sugerencias de tabla con INSERT, INSERT INTO WITH (TABLE_THINT).

+1

Hola, Pasha, terminé usando la opción (NOLOCK) que resolvió el problema (por favor, haz comentarios sobre la pregunta, hay un enlace a un artículo excelente que solía decidir usar la pista (NOLOCK)). Estoy marcando esto como la respuesta, ya que en realidad es lo que hice y nadie más lo publicó como una "respuesta". Gracias :) – Gixonita

Cuestiones relacionadas