TRANSACTION (PROCESS ID 86) WAS DEADLOCKED

26/07/2006 - 19:42 por German | Informe spam
Tengo un problema, mi aplicacion le esta enviando a mis usuarios en algunas
ocasiones el siguiente mensaje de error

"TRANSACTION (PROCESS ID 86) WAS DEADLOCKED ON LOCK RESOURCES WITH ANOTHER
PROCESS AND HAS BEEN CHOSEN AS THE DEADLOCK VICTIM. RERUN THE TRANSACTION."

La base de datos esta en Sql Server 2000 SP4, Agradeceria cualquier ayuda
que me puedan brindar para solucionar este problema.

Gracias.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
27/07/2006 - 09:00 | Informe spam
"German" wrote in message
news:
Tengo un problema, mi aplicacion le esta enviando a mis usuarios en
algunas
ocasiones el siguiente mensaje de error

"TRANSACTION (PROCESS ID 86) WAS DEADLOCKED ON LOCK RESOURCES WITH ANOTHER
PROCESS AND HAS BEEN CHOSEN AS THE DEADLOCK VICTIM. RERUN THE
TRANSACTION."

La base de datos esta en Sql Server 2000 SP4, Agradeceria cualquier ayuda
que me puedan brindar para solucionar este problema.



Esto sucede cuando un proceso A bloquea el recurso X e intenta bloquear
el recurso Y. Pero a la vez hay un proceso B que tiene bloqueado el Y (por
lo que A no puede obtenerlo) y que está intentando bloquear el X (que lo
tiene pillado el A pero nunca lo suelta porque está esperando al Y, que lo
tiene pillado B). Esto se llama un "abrazo mortal" o interbloqueo
(deadlock). SQL Server es capaz de detectar automáticamente esta situación,
y la resuelve matando uno de los dos procesos, con lo cual el programa
cliente que estaba llamando a ese proceso que ha sido matado recibe el error
que indicas.

La forma de que no se produzcan interbloqueos es cuidar de que todos tus
procesos accedan a los recursos en el mismo orden. Por ejemplo, si tienes
una transacción que graba registros en las tablas A y B, no hagas otra que
acceda a B y A, porque corres el riesgo de que se produzca un interbloqueo
si coincide que las dos se ejecutan simultaneamente. Cambia el acceso a B y
A por A y B, y de esa manera esta transacción no podrá interbloquearse con
la otra.
Respuesta Responder a este mensaje
#2 German
27/07/2006 - 19:26 | Informe spam
Agradezco la ayuda, pero donde puedo obtener informacion respecto a la
solucion que me esta planteando, Gracias


"Alberto Poblacion" escribió:

"German" wrote in message
news:
> Tengo un problema, mi aplicacion le esta enviando a mis usuarios en
> algunas
> ocasiones el siguiente mensaje de error
>
> "TRANSACTION (PROCESS ID 86) WAS DEADLOCKED ON LOCK RESOURCES WITH ANOTHER
> PROCESS AND HAS BEEN CHOSEN AS THE DEADLOCK VICTIM. RERUN THE
> TRANSACTION."
>
> La base de datos esta en Sql Server 2000 SP4, Agradeceria cualquier ayuda
> que me puedan brindar para solucionar este problema.

Esto sucede cuando un proceso A bloquea el recurso X e intenta bloquear
el recurso Y. Pero a la vez hay un proceso B que tiene bloqueado el Y (por
lo que A no puede obtenerlo) y que está intentando bloquear el X (que lo
tiene pillado el A pero nunca lo suelta porque está esperando al Y, que lo
tiene pillado B). Esto se llama un "abrazo mortal" o interbloqueo
(deadlock). SQL Server es capaz de detectar automáticamente esta situación,
y la resuelve matando uno de los dos procesos, con lo cual el programa
cliente que estaba llamando a ese proceso que ha sido matado recibe el error
que indicas.

La forma de que no se produzcan interbloqueos es cuidar de que todos tus
procesos accedan a los recursos en el mismo orden. Por ejemplo, si tienes
una transacción que graba registros en las tablas A y B, no hagas otra que
acceda a B y A, porque corres el riesgo de que se produzca un interbloqueo
si coincide que las dos se ejecutan simultaneamente. Cambia el acceso a B y
A por A y B, y de esa manera esta transacción no podrá interbloquearse con
la otra.



Respuesta Responder a este mensaje
#3 Alberto Poblacion
27/07/2006 - 19:52 | Informe spam
"German" wrote in message
news:
Agradezco la ayuda, pero donde puedo obtener informacion respecto a la
solucion que me esta planteando, Gracias



Bueno, la solución no tiene ningún truco. Se trata de revisar todo el
programa, examinar todo lo que hace con la base de datos, comprender
perfectamente todo lo que hace, cuándo lo hace y cómo lo hace, y a
continuación modificar lo que haga falta para que todas las transacciones
que bloqueen más de un recurso lo hagan en el mismo orden.

Por ejemplo, si tienes dos transacciones como estas:
1.
BEGIN TRANS
Update Tabla1
Update Tabla2
COMMIT
2.
Begin Trans
Delete From Tabla2...
Insert Into Tabla1...
Commit

Pues entonces una de las dos hay que cambiarla para que haga las
operaciones en el orden contrario.
Por supuesto que la transacción podría no estar realizada en T-SQL, sino
estar hecha dentro del código fuente con un SqlTransaction, o incluso aunque
no utilices transacciones explícitas se podría bloquear más de una tabla con
un transacción implícita, por ejemplo, en un insert con una subcláusula. Así
que el único remedio es comprender bien lo que hace el programa y revisarlo
cuidadosamente.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida