Discussion:
TRANSACTION (PROCESS ID 86) WAS DEADLOCKED
(demasiado antiguo para responder)
German
2006-07-26 17:42:02 UTC
Permalink
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.
Alberto Poblacion
2006-07-27 07:00:14 UTC
Permalink
Post by German
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.
German
2006-07-27 17:26:01 UTC
Permalink
Agradezco la ayuda, pero donde puedo obtener informacion respecto a la
solucion que me esta planteando, Gracias
Post by Alberto Poblacion
Post by German
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.
Alberto Poblacion
2006-07-27 17:52:27 UTC
Permalink
Post by German
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.

Loading...