2010-06-01 6 views
0

J'utilise SQL Server 2008 Enterprise. Je me demande si le problème de verrou mortel est uniquement causé par des dépendances croisées (par exemple, la tâche A est verrouillée sur L1 mais attend le verrou sur L2 et en même temps, la tâche B verrouille sur L2 mais attend le verrou sur L1)? Y a-t-il d'autres raisons et scénarios qui entraîneront une impasse?Problème de blocage de SQL Server

Y a-t-il un autre moyen qui entraînera un verrouillage à l'état mort - par ex. timeout (une instruction S/I/D/U ne retourne pas très longtemps, et une erreur de blocage sera renvoyée) ou ne peut pas acquérir de verrou pendant longtemps mais pas en raison de dépendances croisées (par exemple, la tâche C doit être verrouiller sur la table T, mais une autre tâche D acquiert le verrou sur la table T sans relâcher la serrure, ce qui fait que la tâche C ne peut pas se verrouiller sur la table T pendant longtemps)?

EDIT 1: cette procédure de stockage entraînera-t-elle un interblocage si elle est exécutée par plusieurs threads en même temps?

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 

merci à l'avance, George

Répondre

2

Les blocages nécessitent un cycle où les ressources sont verrouillées par les processus qui attendent les verrous détenus par d'autres processus pour libérer les verrous. N'importe quel nombre de processus peut participer à un blocage, et la méthode normale pour détecter les blocages est de prendre un graphique des dépendances sur les verrous et de rechercher des cycles dans ce graphique.

Vous devez avoir ce cycle pour qu'un blocage se produise. Tout le reste n'est qu'un processus en attente d'un verrou. Un moyen rapide de voir quels processus sont bloqués par d'autres est sp_who2.

Si vous souhaitez résoudre les blocages, la meilleure solution consiste à exécuter une trace, en sélectionnant les événements 'deadlock graph'. Cela vous permettra de voir ce qui se passe en vous disant quelles requêtes contiennent les verrous.

+0

1. Ainsi les deux scénarios que je décris ne peuvent pas produire deadlock error - timeout (une instruction S/I/D/U ne revient pas très longtemps, et une erreur de blocage sera renvoyée) ou ne peut pas acquérir de verrou pendant une longue période mais n'est pas provoquée par des dépendances croisées? 2. Avez-vous des documents prouvant que seules les interdépendances entraîneront une impasse? – George2

+1

La page wikipedia à http://en.wikipedia.org/wiki/Deadlock en parle en détail. Si vous avez un processus bloqué, vérifiez que vous n'avez pas une session SSMS ouverte qui maintient des verrous sur quelque chose qu'il veut (cela a l'habitude de causer des problèmes de verrouillage mystérieux si vous ne faites pas attention). Pour tester cela, il suffit de déconnecter toutes les sessions ouvertes que vous avez dans les SSM. – ConcernedOfTunbridgeWells

+0

J'ai lu le lien wikipedia, semble que seules les interdépendances vont provoquer un blocage mortel? Et le délai d'attente ne sera pas considéré comme une impasse? – George2

0

tout simplement pas libérer un verrou pour une longue période n'est pas une impasse. Un blocage est une situation dans laquelle vous ne pouvez jamais aller de l'avant.

Il est causé par 2 (ou plus) processus qui attendent que les autres se terminent, mais tous ceux qui sont impliqués maintiennent un verrou qui empêche les autres de continuer. La seule façon de sortir d'une impasse est de tuer les processus pour libérer les verrous car peu importe combien de temps vous attendez, il ne peut pas terminer seul.

+0

1. Ainsi les deux scénarios que je décris ne peuvent pas produire d'erreur deadlock - timeout (une instruction S/I/D/U ne retourne pas très longtemps, et une erreur de blocage sera renvoyée) ou ne peut pas acquérir de verrou depuis longtemps mais pas causée par des dépendances croisées? 2. Avez-vous des documents prouvant que seules les interdépendances entraîneront une impasse? – George2

+1

1) Pas par eux-mêmes, cependant un autre processus pourrait bien produire une situation de blocage avec vos processus de longue durée bien sûr. 2) Le meilleur que je peux trouver est: http://support.microsoft.com/kb/169960 – Don

+0

"Cependant un autre processus pourrait produire une situation de blocage avec vos processus de longue durée bien sûr" - confus à ce sujet, pourriez-vous me montrer un échantillon s'il vous plaît? – George2

2

Il y a aussi des blocages de conversion: les deux processus A et B ont partagé des verrous sur les ressources C. Les deux veulent obtenir des verrous exclusifs sur C.

Même si deux processus sont en concurrence sur une seule ressource, ils peuvent toujours embrasser une impasse. Les scripts suivants reproduisent un tel scénario. Dans un onglet, exécutez ceci:

CREATE TABLE dbo.Test (i INT) ; 
GO 
INSERT INTO dbo.Test 
     (i) 
VALUES (1) ; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; 
BEGIN TRAN 
SELECT i 
FROM dbo.Test ; 

--UPDATE dbo.Test SET i=2 ; 

Une fois ce script terminé, nous avons une transaction en attente contenant un verrou partagé. Dans un autre onglet, Ayons qu'une autre connexion ont un verrou partagé sur la même ressource:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; 
BEGIN TRAN 
SELECT i 
FROM dbo.Test ; 

--UPDATE dbo.Test SET i=2 ; 

Ce script est terminé et rend un jeu de résultats, tout comme le premier script a fait. Maintenant, mettons en évidence et exécutons les commandes de mise à jour commentées dans les deux onglets. Pour effectuer une mise à jour, chaque connexion nécessite un verrou exclusif. Aucune connexion ne peut acquérir ce verrou exclusif, car l'autre détient un verrou partagé.Bien que les deux connexions sont en concurrence sur une seule ressource, ils ont embrassé dans un blocage de conversion:

Msg 1205, niveau 13, état 56, ligne 1 Transaction (ID de processus 59) a été bloqué sur les ressources de verrouillage avec un autre processus et a été choisi comme victime de l'impasse. Réexécutez la transaction.

Notez également que plus de deux connexions peuvent être incluses dans un interblocage.

+0

Le scénario de A/B provoque un problème d'impasse ? Je pense que l'un d'eux pourrait attendre que l'autre lâche le verrou. – George2

+1

Non, les deux attendent les autres versions. Scénario d'impasse typique. –

+0

Merci AlexKuznetsov! J'ai posté la procédure de magasin que j'utilise dans la section EDIT 1 du message original. Des idées si cela provoquera un blocage si exécuté par plusieurs threads en même temps? – George2