2012-09-05 1 views
0

Je reçois des erreurs de blocage lorsque j'essaie d'exécuter un sproc avec une instruction delete. Qu'est-ce qui se passe est que j'ai une ligne de table de contraintes FK qui est en cours de mise à jour en même temps que la ligne de la table que je supprime à laquelle il est lié. Les données en cours de mise à jour dans la table de contraintes ne sont plus importantes et la récupération pour les données mises à jour ne sera plus accessible à personne, pour une raison quelconque, il se peut que cette mise à jour et suppression soient effectuées simultanément. Donc, j'ai besoin de supprimer pour être l'opération principale.Comment surmonter les blocages

Que dois-je faire pour arrêter un blocage comme celui-ci?

DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID; Vous trouverez ci-dessous une capture d'écran d'une table Sidelite et du tableau de contraintes de taille ci-dessous.

Tables in question

Ok, il y a lit pas qui aura lieu ici. Le seul type de choses qui se passent est de nombreuses mises à jour de la table des tailles alors que la table Sidelite essaie de supprimer un enregistrement dont la taille est en cours de mise à jour et cela provoque un blocage.

Je dois arrêter toutes les opérations dans la table des tailles pendant qu'une suppression a lieu dans la table des latéraux et ensuite, je vais supprimer l'enregistrement de taille associé dans un déclencheur.

+2

Quels indices avez-vous? Qu'est-ce que l'instruction 'UPDATE'? Quel RDBMS et version? Quelle est la définition de la contrainte FK? Est-ce que ça cascade? –

Répondre

0

dans l'instruction select où elle obtient la valeur initiale que vous pouvez utiliser avec (readuncommitted) ou avec l'instruction (nolock). Cela vous donnera cependant des lectures sales. S'il vous plaît utiliser le lien suivant pour plus d'informations: Why use a READ UNCOMMITTED isolation level?

0

1.) SET ALLOW_SNAPSHOT_ISOLATION ON

2.) SET TRANSACTION ISOLATION LEVEL SNAPSHOT

ALTER proc [Storefront].[proc_DeleteSidelite] 
@SideliteID INT 
AS 
BEGIN 
SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

    DECLARE @SizeID INT; 
     BEGIN TRAN 
      SELECT @SizeID= sl.SizeID FROM Storefront.Sidelite sl 
            with(nolock) WHERE sl.ID = @SideliteID 
      DELETE FROM Storefront.Sidelite WHERE ID = @SideliteID; 
      DELETE FROM Storefront.Size WHERE [email protected]; 
     COMMIT TRAN 
END; 
Questions connexes