使用select * from V $ SESSION查找行锁定,其中status ='ACTIVE'

时间:2013-12-09 22:35:56

标签: oracle

我无法在我的数据库中更新特定行(直接使用SQL Developer),我正在试图找出原因。更新只是无限进行。我猜测一个查询在该特定行上有锁,但我不确定如何查找。有任何想法吗?什么时候select * from V$SESSION where status='ACTIVE'我没有看到任何表名或查询信息。

阻止会话查询:

  select blocking_instance,blocking_session from v$session where blocking_instance is not null

阻止会话查询结果:

blocking_instance  blocking_session
1                  104
1                  104
1                  104
1                  104
1                  104
1                  144
1                  104

SELECT * FROM dba_blockers

holding_session
55
104
145
92

SELECT * FROM dba_waiters

waiting_session  holding_session  lock_type     mode_held  mode_requested lock_id1  lock_id2
144          55           Transaction   Exclusive  Exclusive      262163    1802
104          55           DML           Row-X (SX) S/Row-X (SSX)  24034     0
96           55           DML           Row-X (SX) Row-X (SX)     24034     0
94           92           Transaction   None       Exclusive      589835    1904
92           92           Transaction   None       Exclusive      589835    1904
104          104          DML           Row-X (SX) S/Row-X (SSX)  24034     0
96           104          DML           Row-X (SX) Row-X (SX)     24034     0
94           145          Transaction   Exclusive  Exclusive      589835    1904
92           145          Transaction   Exclusive  Exclusive      589835    1904

2 个答案:

答案 0 :(得分:1)

您没有提及Oracle的某个版本,但是,如果它是最近合理的,您可以执行以下操作:

select blocking_instance,blocking_session from v$session where sid = <sid of session that is stuck hanging>;

希望有所帮助....

答案 1 :(得分:1)

假设您有持有锁的会话1,等待锁的会话2,以及可以运行查询来诊断问题的会话3,

SELECT *
  FROM dba_blockers

SELECT *
  FROM dba_waiters

将显示哪些会话阻止其他会话以及哪些会话被其他会话阻止以及锁定类型。这将允许您确定会话1阻止会话2。

v$session中,会话2的blocking_session也表示会话1阻止了它。