天天看点

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