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
