CREATE TABLE T_Product(PKID int, PName Nvarchar(50));
GO
BEGIN TRAN
INSERT INTO T_Product VALUES (101, N'嫦娥四號');
GO
DBCC OPENTRAN;
ROLLBACK TRAN;
GO
DROP TABLE T_Product;
GO
輸出關鍵欄位:
若無活動事務,僅回傳資訊性訊息。
SELECT session_id, transaction_id, is_user_transaction, is_local
FROM sys.dm_tran_session_transactions
WHERE is_user_transaction = 1;
結果例:session_id=54, transaction_id=489743。
SELECT s.text
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) s
WHERE session_id = 54;
或使用 sys.dm_exec_requests 取得目前執行陳述式。
SELECT transaction_begin_time,
CASE transaction_type
WHEN 1 THEN 'Read/Write'
WHEN 2 THEN 'Read-Only'
WHEN 3 THEN 'System'
WHEN 4 THEN 'Distributed'
END AS tran_type,
CASE 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 (distributed)'
WHEN 5 THEN 'Prepared, awaiting resolution'
WHEN 6 THEN 'Committed'
WHEN 7 THEN 'Rolling back'
WHEN 8 THEN 'Rolled back'
END AS tran_state
FROM sys.dm_tran_active_transactions
WHERE transaction_id = 489743;
可得知事務啟動時間、類型、目前狀態(如 Active)。
DBCC OPENTRAN 獲取最早活動事務的 SPID。sys.dm_tran_session_transactions 取得對應 transaction_id。sys.dm_exec_connections + sys.dm_exec_sql_text 找出該 SPID 最近執行的 SQL。sys.dm_tran_active_transactions 確認事務持續時間、類型、狀態。KILL(謹慎)。| 場景 | 特徵 | 處理建議 |
|---|---|---|
| 應用異常中斷 | SPID 存在但無對應用戶端進程,事務長時間 Active | KILL SPID 釋放鎖與記錄空間;長期需修正應用連線池/錯誤處理 |
| 隱式事務未提交 | 應用開啟 TransactionScope 但拋出例外未 Dispose | 程式碼審查:確保 using 區塊正確結束事務 |
| 大批次更新未分批 | 單一事務更新百萬列,鎖升級、記錄暴增 | 拆分為小批次,每批提交;或用分區切換 |
| 分散式事務卡在 Prepared | MSDTC 協調失敗,transaction_state=5 | 檢查 MSDTC 日誌、網路、防火牆;必要時用 KILL UOW |