SELECT CASE WHEN l.blocked='1' THEN 'WAITER' ELSE 'HOLDER' END AS role,
s.sess_id,
l.trx_id,
l.lmode,
NVL(o.object_name,'-') AS object_name,
SUBSTR(s.sql_text,1,60) AS sql60
FROM (
SELECT *
FROM v$lock
WHERE TRIM(TRANSLATE(blocked,'01',' ')) IS NULL -- 仅 0 或 1
AND TRIM(TRANSLATE(table_id ,'0123456789',' ')) IS NULL
) l
LEFT JOIN dba_objects o
ON TRIM(l.table_id) = TO_CHAR(o.object_id)
JOIN v$sessions s
ON s.trx_id = l.trx_id
WHERE l.blocked='1' OR l.lmode >= 5
ORDER BY l.trx_id, l.blocked;
好,既然这段 SQL 已经能跑通,就把"最终可用版"整理成一行,方便你直接贴进代码------列类型映射也一起给你:
- 最终锁阻塞巡检 SQL(单行可复制)
sql
复制
SELECT CASE WHEN l.blocked='1' THEN 'WAITER' ELSE 'HOLDER' END AS role, s.sess_id, l.trx_id, l.lmode, NVL(o.object_name,'-') AS object_name, SUBSTR(s.sql_text,1,60) AS sql60 FROM (SELECT * FROM v$lock WHERE TRIM(TRANSLATE(blocked,'01',' ')) IS NULL AND TRIM(TRANSLATE(table_id,'0123456789',' ')) IS NULL) l LEFT JOIN dba_objects o ON TRIM(l.table_id)=TO_CHAR(o.object_id) JOIN v$sessions s ON s.trx_id=l.trx_id WHERE l.blocked='1' OR l.lmode>=5 ORDER BY l.trx_id,l.blocked;
- 列类型与中文含义(对应结果集)
表格
复制
| 列名 | 达梦数据类型 | 中文说明 |
|---|---|---|
| role | VARCHAR(6) | 角色:HOLDER=持锁者,WAITER=等待者 |
| sess_id | BIGINT | 会话 ID,可关联 V$SESSIONS 杀会话 |
| trx_id | BIGINT | 事务 ID,同一事务内多把锁共享 |
| lmode | CHAR(2) | 锁模式:4=S,5=SRX,6=X(>=5 即高粒度) |
| object_name | VARCHAR(512) | 被锁对象名(表/索引/分区) |
| sql60 | VARCHAR(240) | 当前 SQL 前 60 字节,快速定位业务语句 |
- 使用小贴士
-
结果为空 → 当前没有高粒度锁或阻塞,系统健康。
-
出现 WAITER → 同一 trx_id 下找 HOLDER,对比 lmode 即可判断是否需要 kill 会话。
-
想杀锁:
CALL SP_CLOSE_SESSION(sess_id);(需 SYSDBA)