232 votes

Comment vérifier quels verrous sont détenus sur une table ?

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

Y a-t-il un outil qui met en évidence le verrouillage au niveau des lignes de la table en temps réel ?

Base de données : SQL Server 2005

176voto

Brian R. Bondy Points 141769

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

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

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

Il vous indiquera également ce que chaque bloc attend. Vous pouvez donc remonter jusqu'à la déclaration qui a provoqué le premier bloc qui a provoqué les autres blocs.

Editar pour ajouter un commentaire de @MikeBlandford :

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

9 votes

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

1 votes

C'est un bon script à exécuter si vous n'êtes pas un DBA et n'avez pas accès à 'master'.

142voto

mwigdahl Points 8768

Pour ajouter aux autres réponses, sp_lock peut également être utilisé pour obtenir des informations complètes sur le verrouillage de tous les processus en cours. La sortie peut être écrasante, mais si vous voulez savoir exactement ce qui est verrouillé, c'est un outil précieux à utiliser. Je l'utilise généralement avec sp_who2 pour cibler rapidement les problèmes de verrouillage.

Il y a plusieurs versions différentes de "plus amical". sp_lock procédures disponibles en ligne, en fonction de la version de SQL Server en question.

Dans votre cas, pour SQL Server 2005, sp_lock est toujours disponible, mais déprécié, il est donc désormais recommandé d'utiliser la méthode sys.dm_tran_locks pour ce genre de choses. Vous pouvez trouver un exemple de la façon de "rouler votre propre" fonction sp_lock aquí .

97voto

Somnath Muluk Points 10173

Vous pouvez trouver des informations actuelles serrures 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 demande_type_propriétaire existent, le request_owner_id est utilisée pour distinguer chaque instance. Pour les transactions distribuées, la colonne demande_type_propriétaire y el request_owner_guid Les colonnes affichent les différentes informations sur les entités.

Par exemple, la session S1 possède un verrou partagé sur Table1 ; et la transaction T1, qui est exécutée sous la session S1, possède également un verrou partagé sur Table1. Dans ce cas, le description des ressources qui est retournée par sys.dm_tran_locks affichera deux instances de la même ressource. Le site demande_type_propriétaire montrera une instance comme une session et l'autre comme une transaction. De même, la colonne ressource_propriétaire_id auront des valeurs différentes.

0 votes

Cela montre les verrous qui ne sont pas visibles dans les processus !!!

38voto

Jon Points 161

J'utilise une vue de gestion dynamique (DMV) pour capturer les verrous ainsi que l'identifiant d'objet ou de partition de l'élément qui est verrouillé.

(Vous devez passer à la base de données que vous voulez observer pour obtenir l'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;

0 votes

J'essaie d'utiliser cette instruction pour connaître les objets qu'un processus attend. Je peux clairement voir qu'une session attend une autre en utilisant la commande sp_who2 et en sys.dm_os_waiting_task (tous deux essayant de mettre à jour la même table). Mais votre déclaration ne renvoie aucune ligne. Avez-vous une idée ?

28voto

Metin Atalay Points 713

Vous pouvez trouver des détails via le script ci-dessous.

-- List all Locks of the Current Database 
SELECT TL.resource_type AS ResType 
      ,TL.resource_description AS ResDescr 
      ,TL.request_mode AS ReqMode 
      ,TL.request_type AS ReqType 
      ,TL.request_status AS ReqStatus 
      ,TL.request_owner_type AS ReqOwnerType 
      ,TAT.[name] AS TransName 
      ,TAT.transaction_begin_time AS TransBegin 
      ,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura 
      ,ES.session_id AS S_Id 
      ,ES.login_name AS LoginName 
      ,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName 
      ,PARIDX.name AS IndexName 
      ,ES.host_name AS HostName 
      ,ES.program_name AS ProgramName 
FROM sys.dm_tran_locks AS TL 
     INNER JOIN sys.dm_exec_sessions AS ES 
         ON TL.request_session_id = ES.session_id 
     LEFT JOIN sys.dm_tran_active_transactions AS TAT 
         ON TL.request_owner_id = TAT.transaction_id 
            AND TL.request_owner_type = 'TRANSACTION' 
     LEFT JOIN sys.objects AS OBJ 
         ON TL.resource_associated_entity_id = OBJ.object_id 
            AND TL.resource_type = 'OBJECT' 
     LEFT JOIN sys.partitions AS PAR 
         ON TL.resource_associated_entity_id = PAR.hobt_id 
            AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
     LEFT JOIN sys.objects AS PAROBJ 
         ON PAR.object_id = PAROBJ.object_id 
     LEFT JOIN sys.indexes AS PARIDX 
         ON PAR.object_id = PARIDX.object_id 
            AND PAR.index_id = PARIDX.index_id 
WHERE TL.resource_database_id  = DB_ID() 
      AND ES.session_id <> @@Spid -- Exclude "my" session 
      -- optional filter  
      AND TL.request_mode <> 'S' -- Exclude simple shared locks 
ORDER BY TL.resource_type 
        ,TL.request_mode 
        ,TL.request_type 
        ,TL.request_status 
        ,ObjectName 
        ,ES.login_name;

--TSQL commands
SELECT 
       db_name(rsc_dbid) AS 'DATABASE_NAME',
       case rsc_type when 1 then 'null'
                             when 2 then 'DATABASE' 
                             WHEN 3 THEN 'FILE'
                             WHEN 4 THEN 'INDEX'
                             WHEN 5 THEN 'TABLE'
                             WHEN 6 THEN 'PAGE'
                             WHEN 7 THEN 'KEY'
                             WHEN 8 THEN 'EXTEND'
                             WHEN 9 THEN 'RID ( ROW ID)'
                             WHEN 10 THEN 'APPLICATION' end  AS 'REQUEST_TYPE',

       CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
                                     WHEN 2 THEN 'CURSOR'
                                     WHEN 3 THEN 'SESSION'
                                     WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',

       OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME', 
       PROCESS.HOSTNAME , 
       PROCESS.program_name , 
       PROCESS.nt_domain , 
       PROCESS.nt_username , 
       PROCESS.program_name ,
       SQLTEXT.text 
FROM sys.syslockinfo LOCK JOIN 
     sys.sysprocesses PROCESS
  ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()

--Lock on a specific object
SELECT * 
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X