Oracle 的V$LOCK 视图详解

06-02 1266阅读

Oracle 的V$LOCK 视图详解

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

一、V$LOCK 视图结构

列名数据类型描述
SIDNUMBER持有或等待锁的会话标识符
TYPEVARCHAR2(2)锁类型标识符
ID1NUMBER锁标识符1(含义取决于锁类型)
ID2NUMBER锁标识符2(含义取决于锁类型)
LMODENUMBER锁模式(当前持有的模式)
REQUESTNUMBER请求的锁模式
CTIMENUMBER锁已持有或等待的时间(秒)
BLOCKNUMBER是否阻塞其他会话(1=阻塞,0=不阻塞)

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

1. 基本锁类型

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

2. 系统级锁类型

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

三、锁模式(LMODE/REQUEST)

Oracle 锁模式数值定义:

锁模式描述
0None无锁
1Null (N)空模式
2Row-S (SS)行共享
3Row-X (SX)行排他
4Share (S)共享
5S/Row-X (SSX)共享行排他
6Exclusive (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. 查看所有锁信息

        SELECT * FROM v$lock ORDER BY ctime DESC;
        

        2. 查找阻塞会话

        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. 查询特定对象的锁

        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. 解锁方法

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

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

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码