检查Oracle的锁状态并清除问题会话

当多个会话想同时访问一行数据,就有可能发生锁的争用。

查询会话锁定状态:


点击(此处)折叠或打开

  1. select /*+ ordered */ username, v$lock.sid, trunc(id1/power(2,16)) rbs,
  2. bitand(id1,to_number('ffff','xxxx'))+0 slot,
  3. id2 seq, lmode, request
  4. from v$lock, v$session
  5. where v$lock.type = 'TX'
  6. and v$lock.sid = v$session.sid;

USERNAME          SID        RBS       SLOT        SEQ      LMODE    REQUEST
---------- ---------- ---------- ---------- ---------- ---------- ----------
SCOTT             146          4         47      21557          0          6
SCOTT             150          4         47      21557          6          0
SCOTT             161          4         47      21557          0          6

LMODE表示当前获得的锁,REQUEST表示想要获得的锁。
  • 0 - none

  • 1 - null (NULL)

  • 2 - row-S (SS)

  • 3 - row-X (SX)

  • 4 - share (S)

  • 5 - S/Row-X (SSX)

  • 6 - exclusive (X)

从以上结果可以看出,会话150获得了锁,会话146和161进入等待。也可以查看以下视图获得结果:


点击(此处)折叠或打开

  1. SELECT sid, blocking_session, username, blocking_session_status
  2. FROM v$session
  3. WHERE username='SCOTT'
  4. ORDER BY blocking_session;

SID BLOCKING_SESSION USERNAME   BLOCKING_SESSION_STATUS
---------- ---------------- ---------- -----------------------
146              150 SCOTT      VALID
161              150 SCOTT      VALID
150                  SCOTT      NO HOLDER

VALID            被BLOCK
NO HOLDER    没有被BLOCK


如果要关闭会话:


点击(此处)折叠或打开

  1. alter system kill session '11,18';
单引号中分别是,'SID, SERIAL#',这两个都是V$SESSION中的列。


请使用浏览器的分享功能分享到微信等