天天看點

SQL SERVER 事務執行情況跟蹤分析

---檢視現在所有的事務

select '正在運作事務的會話的 ID'=session_id,                     --session_id與transaction_id的對應關系  
       '事務的 ID'=transaction_id,
	   '正在處理事務的會話中的活動請求數'=enlist_count,  
		'使用者or系統事務'=case is_user_transaction when 1 then '事務由使用者請求啟動'
													when 0 then '系統事務'
													end,
		'本地or分布式事務'= case is_local when 0 then '分布式事務或登記的綁定會話事務'
													when 1 then '本地事務'
													end,
		'分布式事務類型'=case is_enlisted when 0 then '非登記的分布式事務'
													when 1 then '登記的分布式事務'
													end,
		'綁定會話中處于狀态'=case is_enlisted when 0 then '事務在通過綁定會話的會話中處于非活動狀态。'
													when 1 then '事務在通過綁定會話的會話中處于活動狀态'
													end		 
		from sys.dm_tran_session_transactions  --會話中的事務,識别所有打開的事務   
		where is_user_transaction =1  


----活動事務的具體資訊  
select dt.transaction_id,  
       dt.name,                          
       dt.transaction_begin_time,  
       case dt.transaction_type         
           when 1 then '讀/寫事務'  
           when 2 then '隻讀事務'  
           when 3 then '系統事務'  
           when 4 then '分布式事務'  
       end 'transaction type',  
         
       case dt.transaction_state  
           when 0 then '事務尚未完全初始化'  
           when 1 then '事務已初始化但尚未啟動'  
           when 2 then '事務處于活動狀态'  
           when 3 then '事務已結束。該狀态用于隻讀事務'  
           when 4 then '已對分布式事務啟動送出程序'  
           when 5 then '事務處于準備就緒狀态且等待解析'  
           when 6 then '事務已送出'  
           when 7 then '事務正在被復原'  
           when 8 then '事務已復原'  
       end  'transaction state',
	   case dt.dtc_state
			when 1 then '活動'
			when 2 then '準備就緒'
			when 3 then	'已送出'
			when 4 then '中止'
			when 5 then '已恢複'
			end dtc_state
			  
from sys.dm_tran_active_transactions dt    --活動的事務  
where transaction_id = 123  


---根據事務ID 和其對應的session_id 找到活動事務對應的執行語句

select	dc.session_id,
		ds.login_name,
		ds.login_time,               
		dc.connect_time,
		dc.client_net_address, 
		ds.host_name,
		ds.program_name,
		case ds.status when 'sleeping' then '睡眠 - 目前沒有運作任何請求 '
						when 'running' then '正在運作 - 目前正在運作一個或多個請求 '
						when 'Dormancy' then '休眠 – 會話因連接配接池而被重置,并且現在處于登入前狀态'
						when 'Pre-connected' then '預連接配接 - 會話在資源調控器分類器中'
						end as status ,
		ds.cpu_time as cpu_time_ms,
		ds.memory_usage*8 as memory_kb,
		ds.total_elapsed_time as total_elapsed_time_ms,
		case ds.transaction_isolation_level when 0 then '未指定'
										when 1 then '未送出讀取'
										when 2 then '已送出讀取'
										when 3 then	'可重複'
										when 4 then '可序列化'
										when 5 then '快照'
										end '會話的事務隔離級别', 
		dt.text              
from sys.dm_exec_connections  dc        --執行連接配接,最近執行的查詢資訊  
cross apply sys.dm_exec_sql_text(dc.most_recent_sql_handle) dt
join sys.dm_exec_sessions ds  on dc.session_id=ds.session_id
where dc.session_id = 55