2010-02-10 5 views
0

Je reçois beaucoup de deadlocks sur une table. Il est SQL Server 2005Comment puis-je connaître le type de verrouillage d'une table?

sp qui devient l'erreur effectue les opérations suivantes

Delete From 
    EmployeeAccrualAdj 
Where 
    EmployeeID = @iEmployeeID and 
    SchemeCode = @sSchemeCode and 
    AdjTypeCode = @sAdjTypeCode and 
    EffectiveDate >= @dtDateFrom 

Je suis en train de travailler si la base de données est en train de faire la ligne, la page ou le verrouillage de table lors de la suppression?

Aussi, je pense à récrire sp à

declare @ToDelete table (id int IDENTITY(1,1), 
         AccrualAdjID int NOT NULL) 


insert into @ToDelete 
SELECT 
    AccrualAdjID 
FROM 
    EmployeeAccrualAdj 
Where 
    EmployeeID = @iEmployeeID and 
    SchemeCode = @sSchemeCode and 
    AdjTypeCode = @sAdjTypeCode and 
    EffectiveDate >= @dtDateFrom 


DECLARE @iCount int, @iMax int 
SELECT 
    @iCount = 1, @iMax = MAX(id) 
FROM 
    @ToDelete 

declare @iAccrualAdjID int 

WHILE @iCount <= @iMax 
BEGIN 

    select @iAccrualAdjID = AccrualAdjID FROM @ToDelete WHERE id = @iCount 

    DELETE FROM EmployeeAccrualAdj 
    WHERE @iAccrualAdjID = AccrualAdjID 


    SET @iCOunt = @iCount + 1 
END 

boucle effectivly à travers les lignes à supprimer et de les supprimer un à la fois.

Je pense que cela ne fera aucune différence s'il y a un verrouillage de ligne, mais le fera s'il y a un verrouillage de page ou de table Qu'est-ce que vous pensez tous?

+0

Le message d'erreur que nous recevons est La transaction (ID de processus 51) a été bloquée au verrouillage | ressources de tampon de communication avec un autre processus et a été choisi comme victime de l'impasse. Réexécutez la transaction. (Erreur lors de l'exécution de la procédure stockée: Employee_AccrualAdjustments_Delete @iEmployeeID = 510337, @sSchemeCode = '' SAH '', @sAdjTypeCode = '' A '', @dtDateFrom = '' 2008-09-20T00: 00: 00 '') ' –

Répondre

1

La réponse dépend du lock escalation rules. L'approche basée sur le curseur que vous vous poserez sera incroyablement lente si vous avez beaucoup de lignes. J'examinerais ce que d'autres requêtes rencontrent cette table pendant l'opération DELETE et verrons si vous pouvez les bloquer pendant la durée de la suppression avec une acquisition de verrou préemptive.

This article donne un exemple de la façon d'acquérir les serrures nécessaires à l'avant avec un indice de verrouillage UPDLOCK.

+0

+ 1 pour la réponse de la performance. – cbrulak

Questions connexes