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

本文介绍了一种SQL Server中查询事务状态、锁定资源及会话间阻塞情况的方法。通过一系列系统视图和函数的联合使用,可以详细了解当前数据库环境中所有活动事务的状态、它们所执行的具体SQL语句、所持有的锁以及可能引发的阻塞等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


进一步查询,这个会话获取了哪些资源

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


再进一步,查询这个会话有没有阻塞其他会话,以及阻塞时间:

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、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
 


 

<think>嗯,用户现在问的是达梦数据库中有哪些系统视图。之前他们问过如何根据SQL_ID查看执行计划,所以可能他们现在在深入学习达梦数据库的管理和监控部分,特别是系统视图相关的信息。 首先,我需要确定用户的需求。他们可能想了解如何利用系统视图来监控数据库状态、性能或者元数据。之前的回答提到了V$SQLAREA和V$SQL_PLAN,所以他们可能已经对这些动态性能视图有所接触,现在想更全面地了解其他可用的系统视图。 接下来,我需要整理达梦数据库的系统视图分类。通常,系统视图分为数据字典视图和动态性能视图。数据字典视图比如USER_TABLES、DBA_INDEXES,而动态性能视图如V$SESSION、V$LOCK。用户可能需要知道这两者的区别以及各自的用途。 然后,要列举常见的系统视图,并给出简要说明和示例查询。比如,数据字典视图帮助用户查看表、索引的结构,动态性能视图则用于实时监控会话、锁、SQL执行情况等。同时,用户可能需要知道如何查询这些视图,例如权限要求,是否需要DBA权限等。 还要注意用户可能的权限问题,比如普通用户可能只能访问USER_开头的视图,而DBA_则需要更高权限。此外,不同版本的达梦可能在视图名称或字段上有差异,需要提醒用户参考官方文档。 用户可能没有明确说明他们的使用场景,但考虑到之前的执行计划问题,他们可能是数据库管理员或开发人员,负责性能调优或故障排查。因此,除了列举视图,还要给出使用示例,帮助他们快速应用。 最后,确保回答结构清晰,分点说明,让用户容易理解。同时补充注意事项,比如权限、版本差异等,避免他们在实际操作中遇到问题。</think>在达梦数据库中,**系统视图**是用于查询数据库元数据、状态和性能信息的重要工具。以下是常见的系统视图分类及用途说明: --- ### **一、数据字典视图(静态信息)** 主要用于查询数据库对象(如表、索引、用户等)的元数据信息。 | 视图名称 | 说明 | 示例查询 | |------------------------|-----------------------------------|-----------------------------------| | `DBA_TABLES` | 所有用户的表信息 | `SELECT * FROM DBA_TABLES;` | | `USER_TABLES` | 当前用户拥有的表信息 | `SELECT TABLE_NAME FROM USER_TABLES;` | | `DBA_INDEXES` | 所有用户的索引信息 | `SELECT INDEX_NAME FROM DBA_INDEXES WHERE TABLE_NAME='表名';` | | `DBA_USERS` | 所有数据库用户信息 | `SELECT USERNAME FROM DBA_USERS;` | | `DBA_SEGMENTS` | 所有段的存储信息(表、索引等) | `SELECT SEGMENT_NAME, BYTES FROM DBA_SEGMENTS;` | | `DBA_CONSTRAINTS` | 所有约束信息(主键、外键等) | `SELECT CONSTRAINT_NAME FROM DBA_CONSTRAINTS WHERE TABLE_NAME='表名';` | --- ### **二、动态性能视图(实时状态)** 用于监控数据库运行时的状态(如会话、锁、事务等)。 | 视图名称 | 说明 | 示例查询 | |------------------------|-----------------------------------|-----------------------------------| | `V$SESSION` | 当前所有会话信息 | `SELECT SESS_ID, SQL_TEXT FROM V$SESSION;` | | `V$LOCK` | 数据库中的锁信息 | `SELECT * FROM V$LOCK WHERE TABLE_NAME='表名';` | | `V$SQLAREA` | 已执行SQL 语句统计信息 | `SELECT SQL_ID, SQL_TEXT FROM V$SQLAREA;` | | `V$SQL_PLAN` | SQL 执行计划详情 | `SELECT * FROM V$SQL_PLAN WHERE SQL_ID='SQL_ID';` | | `V$TABLESPACE` | 表空间使用情况 | `SELECT NAME, TOTAL_SIZE FROM V$TABLESPACE;` | | `V$DATABASE` | 数据库基本信息(名称、状态等) | `SELECT NAME, STATUS FROM V$DATABASE;` | | `V$BUFFER` | 缓冲池使用情况 | `SELECT * FROM V$BUFFER;` | --- ### **三、其他常用视图** | 视图名称 | 说明 | |------------------------|-----------------------------------| | `DBA_OBJECTS` | 所有数据库对象(表、视图、过程等)| | `DBA_VIEWS` | 所有视图的定义信息 | | `DBA_SOURCE` | 存储过程、函数等源码信息 | | `DBA_ROLES` | 所有角色信息 | --- ### **四、使用注意事项** 1. **权限要求** - `DBA_` 开头的视图需要 **DBA 权限**。 - `USER_` 开头的视图仅显示当前用户权限内的对象。 - `V$` 开头的动态视图通常需要 `SELECT ANY TABLE` 权限。 2. **查询示例** ```sql -- 查询当前用户的所有表 SELECT TABLE_NAME FROM USER_TABLES; -- 监控活跃会话 SELECT SESS_ID, USER_NAME, SQL_TEXT FROM V$SESSION WHERE STATE='ACTIVE'; ``` 3. **版本差异** 不同版本的达梦数据库可能对视图名称或字段有调整,具体请参考对应版本的《达梦数据库系统管理员手册》。 --- 通过系统视图,可以高效地管理和监控数据库,建议结合实际需求灵活使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值