Comment vérifier quelles serrures sont tenues sur une table

Comment Pouvons-nous vérifier quels verrous de base de données sont appliqués sur quelles lignes par rapport à un lot de requête?

Tout outil qui met en évidence le verrouillage du niveau de la ligne de la table en temps réel?

De base de données: SQL Server 2005

127
demandé sur Somnath Muluk 2009-03-29 16:46:43

5 réponses

Pour ajouter aux autres réponses, sp_lock peut également être utilisé pour vider les informations de verrouillage complet sur tous les processus en cours. La sortie peut être écrasante, mais si vous voulez savoir exactement ce qui est verrouillé, il est précieux pour l'exécuter. Je l'utilise habituellement avec sp_who2 pour rapidement mettre à zéro les problèmes de verrouillage.

Il existe plusieurs versions différentes de procédures "plus conviviales" sp_lock Disponibles en ligne, selon la version de SQL Server en question.

Dans votre cas, pour SQL Server 2005, sp_lock est encore disponible, mais obsolète, il est maintenant recommandé d'utiliser l'sys.dm_tran_locks vue pour ce genre de chose. Vous pouvez trouver un exemple de la façon de "rouler" sp_lock fonction ici.

103
répondu mwigdahl 2013-11-15 13:55:39

Cela ne vous montre pas exactement quelles lignes sont verrouillées, mais cela peut vous être utile.

Vous pouvez vérifier quelles instructions sont bloquées en exécutant ceci:

select cmd,* from sys.sysprocesses
where blocked > 0

Il vous dira également ce que chaque bloc attend. Ainsi, vous pouvez tracer cela tout le chemin jusqu'à voir quelle instruction a causé le premier bloc qui a causé les autres blocs.

modifier pour ajouter un commentaire de @ MikeBlandford :

La colonne bloquée indique le spid du blocage processus. Vous pouvez exécuter kill {spid} pour le réparer.

87
répondu Brian R. Bondy 2017-05-23 11:33:25

J'utilise une vue de gestion dynamique (DMV) pour capturer les verrous ainsi que l'object_id ou partition_id de l'élément verrouillé.

(doit passer à la base de données que vous voulez observer pour obtenir object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;
33
répondu Jon 2017-08-18 16:41:56

Vous pouvez trouver les verrous actuels sur votre table en suivant la requête.

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

Voir sys. dm_tran_locks

Si plusieurs instances du même request_owner_typeexistent, la colonne request_owner_id est utilisée pour distinguer chaque instance. Pour les transactions distribuées, les colonnes request_owner_type et request_owner_guid afficheront les différentes informations d'entité.

Par exemple, la Session S1 possède un verrou partagé sur Table1; et la transaction T1, qui s'exécute sous la session S1, possède également un verrou partagé sur Table1. Dans ce cas, la resource_description colonne qui est retournée par sys.dm_tran_locks affichera deux instances de la même ressource. La colonne request_owner_type affichera une instance en tant que session et l'autre en tant que transaction. En outre, la colonne resource_owner_id aura des valeurs différentes.

29
répondu Somnath Muluk 2016-08-04 10:27:35

Vous pouvez également utiliser la procédure stockée sp_who2 intégrée pour obtenir les processus bloqués et bloquants actuels sur une instance SQL Server. Typiquement, vous exécutez ceci à côté d'une instance de profileur SQL pour trouver un processus de blocage et regarder la commande la plus récente que spid a émise dans profiler.

16
répondu Neil Barnwell 2009-03-29 12:54:34