Error Interbloqueo

09/03/2009 - 19:12 por Paco | Informe spam
Hola a todos.
Tengo un problema de interbloqueo con un proceso. Les explico.

En algunas tablas tengo triggers de insert y update que ejecutan un
procedimiento almacenado que graba registros en otra tabla para saber si se
han modificado o insertado registros.

La tabla donde se graban los registros tiene esta estructura.

Secuencia, int, identity=si (PK)
Articulo, nvarchar(20)
UID, uniqueidentifier
Operacion, int

El trigger que llama

FOR INSERT
AS

DECLARE @UI uniqueidentifier
SELECT @UI = UI FROM Inserted

EXEC GrabarOperaciones
@Articulo = 'XXXX',
@UI = @UI,
@Operacion = 0 (Para trigger insert, 1 para trigger update)

El procedimiento almacenado al que llaman los triggers es algo así.

CREATE PROCEDURE [GrabarOperaciones]
@Articulo nvarchar(20),
@UI uniqueidentifier,
@Operacion int
AS

UPDATE Operaciones
SET Operacion=@Operacion
WHERE UI=@UI

INSERT INTO Operaciones
(UI,Operacion)
SELECT Articulos.Articulo,@UI,@Operacion
FROM Articulos
WHERE Articulos.Articulo=@Articulo AND
(NOT EXISTS (SELECT Secuencia FROM Operaciones
WHERE Articulo=@Articulo AND IU=@IU))

En la tabla operaciones necesito un único registro por Articulo y UI.

Muchas gracias por la ayuda.
 

Leer las respuestas

#1 Alejandro Mesa
09/03/2009 - 19:38 | Informe spam
Paco,

Cual es el error que estas reciviendo?

En caso de tener problemas con "deadlocks", crees que pudieras crear una
traza para capturar el grafico?

Deadlock Troubleshooting, Part
http://blogs.msdn.com/bartd/archive...art-1.aspx

Deadlock Troubleshooting, Part
http://blogs.msdn.com/bartd/archive...art-2.aspx

Deadlock Troubleshooting, Part
http://blogs.msdn.com/bartd/archive...art-3.aspx


En el procedimiento tienes una sentencia como esta:

UPDATE Operaciones
SET Operacion=@Operacion
WHERE UI=@UI



Por casualidad tienes algun indice por la columna [UI], sino trata de crear
uno y dinos si esto ayuda ha evitar el interbloqueo. Muchas veces los
interbloqueos se producen porque SQL Server debe escalar la granularidad de
los bloqueos, al no contar con indices apropiados.

AMB

"Paco" wrote:

Hola a todos.
Tengo un problema de interbloqueo con un proceso. Les explico.

En algunas tablas tengo triggers de insert y update que ejecutan un
procedimiento almacenado que graba registros en otra tabla para saber si se
han modificado o insertado registros.

La tabla donde se graban los registros tiene esta estructura.

Secuencia, int, identity=si (PK)
Articulo, nvarchar(20)
UID, uniqueidentifier
Operacion, int

El trigger que llama

FOR INSERT
AS

DECLARE @UI uniqueidentifier
SELECT @UI = UI FROM Inserted

EXEC GrabarOperaciones
@Articulo = 'XXXX',
@UI = @UI,
@Operacion = 0 (Para trigger insert, 1 para trigger update)

El procedimiento almacenado al que llaman los triggers es algo así.

CREATE PROCEDURE [GrabarOperaciones]
@Articulo nvarchar(20),
@UI uniqueidentifier,
@Operacion int
AS

UPDATE Operaciones
SET Operacion=@Operacion
WHERE UI=@UI

INSERT INTO Operaciones
(UI,Operacion)
SELECT Articulos.Articulo,@UI,@Operacion
FROM Articulos
WHERE Articulos.Articulo=@Articulo AND
(NOT EXISTS (SELECT Secuencia FROM Operaciones
WHERE Articulo=@Articulo AND IU=@IU))

En la tabla operaciones necesito un único registro por Articulo y UI.

Muchas gracias por la ayuda.

Preguntas similares