## 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)
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í.
/* 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;