当前位置:操作系统 > Unix/Linux >>

查看数据库中有哪些活动的事务,对应的会话id,执行的语句

查看数据库中有哪些活动的事务,对应的会话id,执行的语句
 
[sql] 
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_name  
         
from sys.dm_tran_database_transactions dbt  
left join sys.dm_tran_active_transactions at  
        on dbt.transaction_id = at.transaction_id  
left join sys.dm_tran_session_transactions st  
        on at.transaction_id = st.transaction_id  
  
left join sys.dm_exec_sessions es  
       on st.session_id = es.session_id  
left join sys.dm_exec_connections ec  
       on es.session_id = ec.session_id  
outer apply sys.dm_exec_sql_text(ec.most_recent_sql_handle) tt  

 

 
进一步查询,这个会话获取了哪些资源
[sql] 
select db_name(resource_database_id) 'DatabaseName',  
       object_name(resource_associated_entity_id) 'TableName',  
       request_type,  
       request_mode,  
       request_status  
 select *  
 from sys.dm_tran_locks  

 

 
再进一步,查询这个会话有没有阻塞其他会话,以及阻塞时间:
[sql] 
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个:
[sql] 
select wt.session_id,              --某个会话  
       wait_duration_ms / 1000 as 'wait seconds', --等待秒数  
       wait_type,          --等待类型,可能是进程间的阻塞,也有可能是等待IO完成  
         
       blocking_session_id, --被这个会话阻塞的,如果有的话  
         
       tl.request_mode,     --请求模式,比如S、IX、X  
       tl.request_type,     --请求类型,比如Lock  
       tl.request_status    --是否grant  
  
from sys.dm_os_waiting_tasks wt  
left join sys.dm_tran_locks tl  
       on wt.session_id = tl.request_session_id  
   

 


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,