L'erreur de blocage ne renvoie pas le blocage SQL


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

J'obtiens cette erreur de manière aléatoire lorsqu'un de mes sites Web est occupé. Je sais à peu près sur quels ensembles de tables cela se produit, mais d'après mon expérience avec d'autres programmes, j'obtiens normalement le SQL retourné là où le blocage se produit. Existe-t-il un indicateur que je devrais activer pour permettre que cela se produise?

Je vais essayer de déboguer le blocage lui-même comme un problème distinct car c'est ma principale question pour l'instant.

J'utilise SQL Server 2008 Standard Edition.


Pouvez-vous redémarrer le service? Si vous parvenez à renvoyer le service, vous pouvez ajouter l'indicateur de trace 1204 à vos paramètres de démarrage pour consigner les détails du blocage dans le journal SQL Server. > 1204: Renvoie les ressources et les types de verrous participant à un blocage ainsi que la commande actuelle affectée.
>>

1
Utilisez le gestionnaire de configuration. Sous Services SQL Server, cliquez avec le bouton droit et ouvrez les propriétés. Accédez à l'onglet Avancé, paramètres de démarrage. Vous aurez des entrées pour l'emplacement des fichiers de la base de données principale et autres. Ajoutez ;-T1204pour que l'indicateur de trace se termine et redémarrez le service.
Tevo D

4
Pourquoi redémarrer le service? DBCC TRACEON (1204, -1)
Mark Storey-Smith

À partir de msdn.microsoft.com/en-us/library/ms188396.aspx : changements de comportement: dans SQL Server 2000, un simple DBCC TRACEON (1204) est suffisant pour activer le rapport de blocage dans le journal des erreurs. Dans SQL Server 2008, vous devez activer l'indicateur globalement, car l'indicateur au niveau de la session n'est pas visible par le thread du moniteur de blocage.
Tevo D

2
@TevoD - Le -1paramètre à DBCC TRACEONsignifie global.
Martin Smith

Réponses:


25

Les données dont vous avez besoin sont enregistrées dans la trace d'événements étendue par défaut.

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

Bien qu'il ne sera plus là si vous avez redémarré le service -eg pour appliquer un indicateur de trace ou si le tampon a cyclé entre-temps.

Vous pouvez configurer votre propre trace d'événements étendue qui stocke le graphique de blocage dans une cible de fichier pour un stockage non volatil persistant. Exemple de code ici . Personnellement, je trouve le graphique XML de blocage plus convivial que la sortie de l'indicateur de trace.

Éditer

  1. @MartinC souligne dans les commentaires que sur les instances de SQL Server qui n'ont pas toutes les mises à jour, il peut y avoir un problème avec la génération de XML non valide. Le correctif consiste à effectuer des recherches, à remplacer et à utiliser CAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraphla SELECTliste comme décrit ici .
  2. Wayne Sheffield a posté un script utile pour déchiqueter le XML graphique de blocage en forme de tableau ici .

Malheureusement, EE ne capture pas tous les blocages et semble être un bug: connect.microsoft.com/SQLServer/feedback/details/754115/…
Matt

3

La réponse acceptée n'a pas fonctionné pour moi de manière cohérente. Le tampon en anneau est apparemment connu pour supprimer des événements dans certaines circonstances.

ConnectItem

Problèmes de tampon d'anneau

Les fichiers d'événements du journal system_health peuvent être analysés (à partir de cette réponse ):

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

Le champ XdlFile peut être enregistré dans un fichier .xdl et lu dans SSMS. Testé dans Sql Server 2012.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.