select dbt.database_id,DB_NAME(dbt.database_id) '数据库名',dbt.transaction_id,at.name,at.transaction_begin_time,case at.transaction_type --事务类型 when 1 then '读/写事务' when 2 then '只读事务' when 3 then '系统事务' when 4 then '分布式事务' end 'transaction类型', case at.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状态',st.session_id, tt.text as '最近执行的语句',es.program_namefrom sys.dm_tran_database_transactions dbt
left join sys.dm_tran_active_transactions aton dbt.transaction_id = at.transaction_id
left join sys.dm_tran_session_transactions ston at.transaction_id = st.transaction_idleft join sys.dm_exec_sessions eson st.session_id = es.session_id
left join sys.dm_exec_connections econ es.session_id = ec.session_id
outer apply sys.dm_exec_sql_text(ec.most_recent_sql_handle) tt
进一步查询,这个会话获取了哪些资源
select db_name(resource_database_id) 'DatabaseName',object_name(resource_associated_entity_id) 'TableName',request_type,request_mode,request_statusselect *from sys.dm_tran_locks
再进一步,查询这个会话有没有阻塞其他会话,以及阻塞时间:
select session_id, --某个会话wait_duration_ms / 1000, --等待秒数wait_type, --等待类型,可能是进程间的阻塞,也有可能是等待IO完成blocking_session_id --被这个会话阻塞的,如果有的话from sys.dm_os_waiting_tasks
where blocking_session_id = xxx
再进一步,合并上面2个:
select wt.session_id, --某个会话wait_duration_ms / 1000 as 'wait seconds', --等待秒数wait_type, --等待类型,可能是进程间的阻塞,也有可能是等待IO完成blocking_session_id, --被这个会话阻塞的,如果有的话tl.request_mode, --请求模式,比如S、IX、Xtl.request_type, --请求类型,比如Locktl.request_status --是否grantfrom sys.dm_os_waiting_tasks wt
left join sys.dm_tran_locks tlon wt.session_id = tl.request_session_id