Oracle,lock mode

Posted by Alei Blog on October 25, 2017

场景

  • 有时中间件并发量很大,会提示单据/数据库锁定
  • 这个时候,需要排查中间件的业务锁,事务锁,也需要排查数据库的锁

排查数据库死锁

  • 查询表锁定
    select c.sid         , c.serial#    , a.oracle_username , a.os_user_name , 
         b.object_name , a.locked_mode, c.machine         , c.event
    from v$locked_object a, dba_objects b, v$session c
     where b.object_id  = a.object_id
     and a.session_id = c.sid
     and a.oracle_username = '数据库用户名大写'
    
  • 查询结果
SID SERIAL# OBJECT_NAME LOCKED_MODE
964 2995 TBL_MESSAGE_CALL_INFO 3
830 3721 TBL_MESSAGE_CALL_INFO 3
682 2749 TBL_MESSAGE_CALL_INFO 3
636 8015 TBL_MESSAGE_CALL_INFO 3
337 6775 TBL_MESSAGE_CALL_INFO 3
201 10643 FTS_PAYMENTRECEIPT 3
201 10643 FTS_ACCOUNT_DETAIL 3

lock mode 是什么

  • 上面的查询结果,locked_mode值为3,这是什么意思
  • lock mode值的含义如下 数值 | 英文含义 | 中文 – | – | – 0 | none | 1 | null | 空 2 | Row-S: sub share | 行共享 3 | Row-X: sub exclusive | 行独占 4 | Share | 共享,阻止其他DML操作 5 | S/Row-X | 共享行独占,阻止其他事务操作 6 | X:exclusive | 独立访问

lock type 是什么

  • 查询lock type
    select * from v$lock_type;
    
  • 最常见的lock type
    select * from v$lock_type where type in ('TM','TX');
    
  • lock type 是比 lock mode 更细小的概念
  • TM, TX对应的lock mode数值是3

Mark 理解透彻了再补充