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.

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 Paco
10/03/2009 - 16:17 | Informe spam
Hola Alejandro

Muchas gracias por la ayuda y por los links. Muy interesantes e ilustrativos.

No tenía ningún índice por la columna UI, lo he creado y han desaparecido
los interbloqueos.

"Alejandro Mesa" wrote:

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 1
http://blogs.msdn.com/bartd/archive...art-1.aspx

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

Deadlock Troubleshooting, Part 3
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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida