Détecter les inter blocages

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

Laisser un commentaire