2010-06-08 8 views
0

J'utilise SQL Server 2008 Enterprise. J'ai essayé que si je place le journal de transactions de SQL Server pour augmenter pour la base de données connexe (sans paramètres de sauvegarde), une seule instruction de suppression de cette procédure stockée provoquera un blocage si elle est exécutée par plusieurs threads en même temps? Des idées pourquoi? Pour l'instruction delete, Param1 est une colonne de la table FooTable, Param1 est une clé étrangère d'une autre table (se réfère à une autre colonne d'index clusterisée de clé primaire de l'autre table). Il n'y a pas d'index sur Param1 lui-même pour la table FooTable. FooTable a une autre colonne qui est utilisée comme clé primaire en cluster, mais pas la colonne Param1.blocage lorsque le journal des transactions SQL Server jamais augmenter?

create PROCEDURE [dbo].[FooProc]  
( 
@Param1 int 
,@Param2 int 
,@Param3 int 
)  
AS  

DELETE FooTable WHERE Param1 = @Param1  

INSERT INTO FooTable  
( 
Param1 
,Param2 
,Param3 
)  
VALUES  
( 
@Param1 
,@Param2 
,@Param3 
)  

DECLARE @ID bigint  
SET @ID = ISNULL(@@Identity,-1)  
IF @ID > 0  
BEGIN  
     SELECT IdentityStr FROM FooTable WHERE ID = @ID 
END 
+1

Est-ce vraiment un interblocage (avec un thread abandonné en tant que victime de blocage), ou est-ce juste un " retarder "jusqu'à ce que le premier fil finit ?? –

+3

George, c'est la troisième fois que vous posez des questions sur la même impasse et que vous n'avez jamais fourni les infos sur l'impasse. Sans l'info de blocage, vous perdez votre temps. Attachez le profileur, surveillez la classe d'événements du graphe interblocable * uniquement *, attendez que le blocage se produise, joignez le fichier .xdl enregistré à votre message. –

+0

@ Marc, c'est l'impasse. Je l'attrape dans le journal. Toute relation entre le journal des transactions augmente-t-elle et l'impasse? – George2

Répondre

4

En règle générale, vous devez toujours créer un index sur la colonne ayant une contrainte FOREIGN KEY. Sinon, un blocage est très probable (car le serveur doit verrouiller toute la table dépendante pour garantir cette contrainte)

+0

Avez-vous des idées pour savoir pourquoi un interblocage se produit si le journal des transactions augmente constamment? – George2

+1

Non ... Le journal des transactions se termine après que le serveur SQL a rencontré une transaction ouverte. – a1ex07

+0

Merci, réponse à la question! – George2