Oracle 的V$LOCK 视图详解

Oracle 的V$LOCK 视图详解

V$LOCK 是 Oracle 数据库中最重要的动态性能视图之一,用于显示当前数据库中锁的持有和等待情况。

一、V$LOCK 视图结构

列名 数据类型 描述
SID NUMBER 持有或等待锁的会话标识符
TYPE VARCHAR2(2) 锁类型标识符
ID1 NUMBER 锁标识符1(含义取决于锁类型)
ID2 NUMBER 锁标识符2(含义取决于锁类型)
LMODE NUMBER 锁模式(当前持有的模式)
REQUEST NUMBER 请求的锁模式
CTIME NUMBER 锁已持有或等待的时间(秒)
BLOCK NUMBER 是否阻塞其他会话(1=阻塞,0=不阻塞)

二、主要锁类型(TYPE字段)

1. 基本锁类型

类型 描述
TX 事务锁(行级锁)
TM DML锁(表级锁)
UL 用户自定义锁(DBMS_LOCK创建)

2. 系统级锁类型

类型 描述
ST 空间事务锁
TT 临时表锁
SQ 序列锁
CF 控制文件锁

三、锁模式(LMODE/REQUEST)

Oracle 锁模式数值定义:

锁模式 描述
0 None 无锁
1 Null (N) 空模式
2 Row-S (SS) 行共享
3 Row-X (SX) 行排他
4 Share (S) 共享
5 S/Row-X (SSX) 共享行排他
6 Exclusive (X) 排他

四、ID1 和 ID2 的含义

1. TX 锁(事务锁)

  • ID1:Undo 段号 + 事务槽号(USN.SLT)
  • ID2:事务序列号(WRAP)

2. TM 锁(表锁)

  • ID1:被锁定对象的 OBJECT_ID
  • ID2:通常为 0

3. UL 锁(用户锁)

  • ID1:DBMS_LOCK.ALLOCATE_UNIQUE 分配的锁ID
  • ID2:通常为 0

五、实用查询示例

1. 查看所有锁信息

sql 复制代码
SELECT * FROM v$lock ORDER BY ctime DESC;

2. 查找阻塞会话

sql 复制代码
SELECT 
  l1.sid AS "阻塞会话ID",
  s1.username AS "阻塞用户",
  s1.osuser AS "阻塞OS用户",
  s1.machine AS "阻塞机器",
  l2.sid AS "被阻塞会话ID",
  s2.username AS "被阻塞用户",
  l1.type AS "锁类型",
  DECODE(l1.type,
    'TX', '事务锁',
    'TM', '表锁',
    'UL', '用户锁',
    l1.type) AS "锁描述",
  l1.ctime AS "持有时间(秒)"
FROM v$lock l1, v$lock l2, v$session s1, v$session s2
WHERE l1.block = 1 
AND l2.request > 0
AND l1.id1 = l2.id1
AND l1.id2 = l2.id2
AND l1.sid = s1.sid
AND l2.sid = s2.sid;

3. 查询特定对象的锁

sql 复制代码
SELECT l.sid, s.username, s.status, l.type, l.lmode, l.ctime, o.object_name
FROM v$lock l, dba_objects o, v$session s
WHERE l.id1 = o.object_id(+)
AND l.type = 'TM'
AND l.sid = s.sid
AND o.object_name = 'EMPLOYEES';

六、锁诊断与问题解决

1. 常见锁问题

  • TX锁等待:最常见的事务冲突
  • TM锁冲突:DDL与DML操作冲突
  • 死锁:ORA-00060错误

2. 解锁方法

sql 复制代码
-- 1. 查找阻塞会话
SELECT sid, serial#, username FROM v$session 
WHERE sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL);

-- 2. 终止会话
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

VLOCK 视图是诊断 Oracle 锁问题的关键工具,结合 VSESSION 和 V$LOCKED_OBJECT 等视图可以全面分析锁情况。

相关推荐
Fortune_yangyang17 小时前
Docker 入门指南:从 “容器小白” 到快速上手
运维·docker·容器
·云扬·18 小时前
InnoDB事务隔离级别与加锁机制深度解析
数据库·sql·mysql
不穿格子的程序员18 小时前
Redis篇8——Redis深度剖析:揭秘 Redis 高性能
数据库·redis·缓存·nio·io多路复用
HIT_Weston18 小时前
68、【Ubuntu】【Hugo】搭建私人博客:方案分析(二)
linux·运维·ubuntu
悦悦子a啊18 小时前
Maven 项目实战入门之--学生管理系统
java·数据库·oracle
他是龙55118 小时前
46:SQLMap实战全攻略(猜解/权限/绕过/调试)
数据库·oracle
一位代码18 小时前
mysql | 环境变量问题及其配置方法详解
数据库·mysql
煎蛋学姐19 小时前
SSM校企协同育人平台j670k(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 框架开发
cws20040119 小时前
HeidiSQL 使用操作说明书
运维·数据库·windows·mysql·heidisql
Pyeako19 小时前
MySQL基础知识&Linux导入导出数据
linux·数据库·mysql·sql查询·sql分类