Preskočiť na obsah
Skript

Detail blockera – aj spiaca session s otvorenou transakciou

Každý blokovaný request s detailom session, ktorá ho blokuje: stav, login, host, otvorené transakcie a posledný príkaz, aj keď blocker práve spí.

detail-blockera-aj-spiaca-session-s-otvorenou-transakciou.sql 35 riadkov · T-SQL
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Detail blockera – aj spiaca session s otvorenou transakciou
   Účel:  Každý blokovaný request s detailom session, ktorá ho blokuje: stav, login, host, otvorené transakcie a posledný príkaz, aj keď blocker práve spí.
   Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;

SELECT r.session_id                AS blocked_session_id,
       r.blocking_session_id,
       CASE WHEN NOT EXISTS (SELECT 1 FROM sys.dm_exec_requests AS r2
                             WHERE r2.session_id = r.blocking_session_id
                               AND r2.blocking_session_id <> 0)
            THEN 1 ELSE 0 END      AS blocker_is_head,
       r.wait_type,
       r.wait_time                 AS wait_ms,
       r.wait_resource,
       DB_NAME(r.database_id)      AS database_name,
       bs.login_name               AS blocked_login,
       bs.host_name                AS blocked_host,
       hs.status                   AS blocker_session_status,
       hs.login_name               AS blocker_login,
       hs.host_name                AS blocker_host,
       hs.program_name             AS blocker_program,
       hs.open_transaction_count   AS blocker_open_transactions,
       hs.last_request_start_time  AS blocker_last_request_start,
       hs.last_request_end_time    AS blocker_last_request_end,
       blocked_sql.text            AS blocked_batch,
       blocker_sql.event_info      AS blocker_last_input
FROM sys.dm_exec_requests AS r
JOIN sys.dm_exec_sessions AS bs ON bs.session_id = r.session_id
LEFT JOIN sys.dm_exec_sessions AS hs ON hs.session_id = r.blocking_session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS blocked_sql
OUTER APPLY sys.dm_exec_input_buffer(r.blocking_session_id, NULL) AS blocker_sql
WHERE r.blocking_session_id > 0
ORDER BY blocker_is_head DESC, r.wait_time DESC, r.session_id;
## Kedy použiť

Pri timeoutoch aplikácie, čakaní `LCK_M_*` a reťazovom blokovaní – keď potrebuješ vedieť, **čo blocker naposledy poslal**.

## Ako čítať výsledok

`blocked_session_id` je obeť, `blocking_session_id` je session, ktorú treba skúmať. `blocker_is_head = 1` označuje začiatok reťaze. Stav `sleeping` + `blocker_open_transactions > 0` = aplikácia nechala otvorenú transakciu; `blocker_last_input` ukáže jej posledný príkaz.

> [!WARNING]
> Záporné `blocking_session_id` (-2 orphaned DTC, -3 deferred recovery, -4 latch) nie sú bežné SPID. Nikdy nespúšťaj `KILL` len podľa tohto výstupu – rollback dlhej transakcie môže trvať dlhšie než samotné blokovanie.

**Oprávnenia:** `VIEW SERVER STATE` (na SQL Server 2022 stačí aj `VIEW SERVER PERFORMANCE STATE`).  
**Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022

## Súvisiace recepty

- [Kto koho blokuje (blocking chain)](script.php?id=1&s=kto-koho-blokuje-blocking-chain)
- [Otvorené transakcie](script.php?id=15&s=otvorene-transakcie-kto-ich-drzi-a-ako-dlho)
- [sp_WhoIsActive](script.php?id=10&s=sp-whoisactive-kto-co-prave-robi-na-serveri)