URGENTISIMO: evitar "deadlocked"

08/07/2004 - 11:51 por Víctor | Informe spam
Hola.

Estoy teniendo un montón de errores de "deadlocked".

Además de intentar optimizar la lógica y de utilizar el "BEGIN TRAN" lo más
tarde posible, ¿hay alguna manera de que no se produzca?

Pensaba que este error es cuando dos procesos intentar acceder a la misma
tabla, pero ¿no se han quedan en cola esperando? Porque esto último sí que
me pasa de vez en cuando.

Muchas gracias.
 

Leer las respuestas

#1 Carlos Sacristan
08/07/2004 - 12:18 | Informe spam
No, no es por eso. Imagínate esta situación:

el proceso 1 realiza una operación que requiere un bloqueo exclusivo
sobre la página 1 de la tabla t1; mientras, el proceso 2 realiza otra
operación que realiza otro bloqueo exclusivo sobre la página 2 de la misma
tabla. En la misma transacción, el proceso 1 requiere acceder a la página 2,
pero no puede por estar bloqueada, así que se queda esperando a que se
libere. El "deadlock" sucede cuando a continuación el proceso 2 intenta
acceder a la página 1 y se queda esperando a que se libere porque el proceso
1 la ha bloqueado de forma exclusiva.

¿Qué es lo que está ocurriendo?: ambos procesos se quedan esperando a
que se liberen recursos de forma indefinida si nadie pone remedio. Es
entonces cuando el motor decide quién es la víctima que en teoría es más
propicia y la mata, con lo que los recursos que están bloqueando se liberan
y el otro proceso que estaba esperando puede finalizar.

Una forma de evitar (o al menos reducir) los deadlock es pedir los
recursos siempre en el mismo orden y seleccionar el nivel de aislamiento de
las transacciones adecuado (si hay transacciones SERIALIZABLE es probable
que también se produzcan este tipo de situaciones). De todos modos, echa un
vistazo a este artículo (en inglés, pero creo que se entiende bien):
http://www.sql-server-performance.c...dlocks.asp


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Víctor" escribió en el mensaje
news:
Hola.

Estoy teniendo un montón de errores de "deadlocked".

Además de intentar optimizar la lógica y de utilizar el "BEGIN TRAN" lo


más
tarde posible, ¿hay alguna manera de que no se produzca?

Pensaba que este error es cuando dos procesos intentar acceder a la misma
tabla, pero ¿no se han quedan en cola esperando? Porque esto último sí que
me pasa de vez en cuando.

Muchas gracias.


Preguntas similares