Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/08/2011, 21:04
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Tengo un error de bloqueo

Supone que tienes la tabla T1 con la fila F1, y una transacción que tiene bloqueada la fila (ej: por un update), y aparece una segunda transacción que solicita un bloqueo sobre la misma fila, en este caso el motor la pone en espera hasta que finalice la primera transacción y después le asigna el bloqueo a la segunda, esto es algo normal que se da constantemente, no genera errores aunque en casos excesivos afecta el rendimiento, esto lo puedes ver en el contador Lock Wait Time del Performance Monitor de Windows.

Un interbloqueo es diferente, si tienes la tabla T1 con la fila F1, la tabla T2 con la fila F1, una transacción TX1 que tiene bloqueada la fila T1.F1 y además solicita un bloqueo sobre la fila T2.F1, al mismo tiempo, tienes otra transacción TX2 con un bloqueo sobre la fila T2.F1 que solicita un bloqueo sobre la fila T1.F1, es aquí donde se produce un interbloqueo o deadlock ya que las dos transacciones están en espera de que se liberen las filas solicitadas y las filas no se liberan porque las transacciones no terminan. Como solución, el motor elige una transacción (generalmente la última en empezar) y la termina con un rollback. Esto es lo que ves en el log "La transacción (Id. de proceso 78) quedo en interbloqueo... y fue elegida como sujeto del interbloqueo".

En general los deadlock se producen por:

1. Errores de diseño, sea en procesos T-SQL batch, procedures, triggers, gestión de transacciones o modelo ER. Si este es el caso, tendrás deadlocks muy seguido, y como ya comentaron, deberás identificar que lo genera, el SQL Server Profiler puede ser muy útil, más info en http://msdn.microsoft.com/en-us/library/ms188246.aspx y http://msdn.microsoft.com/en-us/library/ms178104.aspx

2. Concurrencia, es muy poco probable que sea por una alta concurrencia de usuarios, pero posible. Si este es el caso, rara vez tendrás un deadlock, podrías analizar el problema, pero teniendo en cuenta que el motor resuelve los deadlock con consistencia, puede ser mas práctico ignorar el error y volver a ejecutar el proceso.

Saludos