我无法在我的数据库中更新特定行(直接使用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
答案 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阻止了它。