N’avez vous jamais entendu un utilisateur vous dire « L’application est lente » ou « Nous sommes tous bloqués, nous ne pouvons plus rien faire.. à l’aide !! « . On peut se demander par où commencer. Une 1ère piste serait de regarder les inter blocages existants. Voici un petit script qui permet de les récupérer à partir de sqlserver 2005.
Les informations fournies sont les id de sessions bloquées , l’id de la session bloquante, les hôtes, les types de verrous existants, les niveaux d’isolations, les bases de données concernées et quelques autres informations qui pourront vous être utile pour le débogage.
– Informations de blocage
SELECT
   DB_NAME(l.resource_database_id) AS databaseName,
   l.resource_type,Â
   l.resource_associated_entity_id,
   l.request_mode,
   l.request_session_id,
   s.host_name,
   s.login_name,
   s.program_name,
   s.client_interface_name,
   s.status,
   CASE s.transaction_isolation_level
       WHEN 1 THEN ‘Read Uncommited’
       WHEN 2 THEN ‘Read Commited’
       WHEN 3 THEN ‘Repeatable’
       WHEN 4 THEN ‘Serializable’
       WHEN 5 THEN ‘Snapshot’
       ELSE ‘Unspecified’
   END transaction_isolation_level,
   wt.wait_type,
   r.command,
   txt.text,
   r.blocking_session_id,
   p.hostname AS hostname_blocking,
   p.program_name AS program_name_blocking,
   p.loginame AS loginame_blocking,
   txtb.text
FROM sys.dm_tran_locks l
INNER JOIN sys.dm_os_waiting_tasks wt
ON l.lock_owner_address = wt.resource_address
INNER JOIN sys.dm_exec_sessions s
ON l.request_session_id = s.session_id
INNER JOIN sys.dm_exec_requests r
ON s.session_id = r.session_id
INNER JOIN sys.dm_exec_sessions sb
ON r.blocking_session_id = sb.session_id
INNER JOIN sys.sysprocesses p
ON r.blocking_session_id = p.spid
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) txt  Â
CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) txtb
Bon déblocage !!
++
David BARBARIN (Mikedavem)
Elève ingénieur CNAM Lyon