Preskočiť na obsah
Skript

Otvorené transakcie – kto ich drží a ako dlho

Session s otvorenou transakciou: vek transakcie, typ, stav, koľko logu zaberá a posledný príkaz. Na rastúci log a „zabudnutý“ COMMIT.

otvorene-transakcie-kto-ich-drzi-a-ako-dlho.sql 39 riadkov · T-SQL
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Otvorené transakcie – kto ich drží a ako dlho
   Účel:  Session s otvorenou transakciou: vek transakcie, typ, stav, koľko logu zaberá a posledný príkaz. Na rastúci log a „zabudnutý“ COMMIT.
   Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;

SELECT st.session_id,
       s.status                 AS session_status,
       s.login_name,
       s.host_name,
       s.program_name,
       s.open_transaction_count,
       at.transaction_id,
       at.name                  AS transaction_name,
       at.transaction_begin_time,
       DATEDIFF(MINUTE, at.transaction_begin_time, SYSDATETIME()) AS tran_age_minutes,
       CASE at.transaction_type WHEN 1 THEN 'read/write' WHEN 2 THEN 'read-only'
            WHEN 3 THEN 'system' WHEN 4 THEN 'distributed' END      AS transaction_type,
       CASE at.transaction_state WHEN 0 THEN 'not initialized' WHEN 1 THEN 'initialized, not started'
            WHEN 2 THEN 'active' WHEN 3 THEN 'ended (read-only)' WHEN 4 THEN 'commit initiated (DTC)'
            WHEN 5 THEN 'prepared, waiting' WHEN 6 THEN 'committed' WHEN 7 THEN 'rolling back'
            WHEN 8 THEN 'rolled back' END                          AS transaction_state,
       CAST(dt.log_bytes_used / 1048576.0 AS decimal(18,1))        AS log_used_mb,
       dt.database_names,
       ib.event_info            AS last_submitted_command
FROM sys.dm_tran_session_transactions AS st
JOIN sys.dm_tran_active_transactions AS at ON at.transaction_id = st.transaction_id
JOIN sys.dm_exec_sessions AS s ON s.session_id = st.session_id
OUTER APPLY (SELECT SUM(d.database_transaction_log_bytes_used) AS log_bytes_used,
                    STUFF((SELECT N', ' + DB_NAME(d2.database_id)
                           FROM sys.dm_tran_database_transactions AS d2
                           WHERE d2.transaction_id = st.transaction_id
                           FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 2, N'') AS database_names
             FROM sys.dm_tran_database_transactions AS d
             WHERE d.transaction_id = st.transaction_id) AS dt
OUTER APPLY sys.dm_exec_input_buffer(st.session_id, NULL) AS ib
WHERE s.is_user_process = 1
ORDER BY at.transaction_begin_time;
## Kedy použiť

Keď rastie transaction log, visia zámky alebo aplikácia zabudla COMMIT / ROLLBACK.

## Ako čítať výsledok

`tran_age_minutes` + `session_status = sleeping` = otvorená transakcia, ktorá nič nerobí. `log_used_mb` ukazuje, koľko logu transakcia drží.

> [!WARNING]
> Jedna session môže mať viac riadkov (distribuované transakcie, viac databáz). Otvorená transakcia nemusí blokovať – porovnaj s detailom blockera.

**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

- [Detail blockera](script.php?id=14&s=detail-blockera-aj-spiaca-session-s-otvorenou-transakciou)
- [Transaction log – obsadenie, reuse wait a VLF](script.php?id=33&s=transaction-log-obsadenie-reuse-wait-a-vlf)