Oracle 使用select*from V$SESSION查找行锁,其中status='ACTIVE'
我无法在数据库中直接使用SQL Developer更新特定行,我正在试图找出原因。更新一直在无限地进行。我猜某个查询在该特定行上有一个锁,但我不确定如何找到。有什么想法吗?当执行select*from V$会话时,其中status='ACTIVE'我看不到任何表名或查询信息 阻止会话查询: 阻止会话查询结果: 从dba_拦截器中选择* 从dba_waiters中选择*Oracle 使用select*from V$SESSION查找行锁,其中status='ACTIVE',oracle,Oracle,我无法在数据库中直接使用SQL Developer更新特定行,我正在试图找出原因。更新一直在无限地进行。我猜某个查询在该特定行上有一个锁,但我不确定如何找到。有什么想法吗?当执行select*from V$会话时,其中status='ACTIVE'我看不到任何表名或查询信息 阻止会话查询: 阻止会话查询结果: 从dba_拦截器中选择* 从dba_waiters中选择* 您没有提到Oracle的一个版本,但是,如果它是合理的最新版本,您可以执行以下操作: select blocking_insta
您没有提到Oracle的一个版本,但是,如果它是合理的最新版本,您可以执行以下操作:
select blocking_instance,blocking_session from v$session where sid = <sid of session that is stuck hanging>;
希望这有助于……假设您有会话1持有锁,会话2等待锁,会话3可以运行查询来诊断问题
SELECT *
FROM dba_blockers
SELECT *
FROM dba_waiters
将显示哪些会话正在阻止其他会话,哪些会话被其他会话阻止,以及锁的类型。这将允许您确定会话1正在阻止会话2
在v$session中,会话2的blocking_会话还将指示它已被会话1阻塞。所以我应该杀死任何没有空blocking_实例和blocking_会话的会话?我不知道哪一节课是最重要的stuck@c12-在blocking_instance和blocking_session中具有值的会话是被阻止的会话。我想,你可以结束那次会议。但是你通常会对拦截器而不是被拦截器更感兴趣,并且在不弄清楚它为什么持有锁的情况下盲目地杀死东西似乎是短视的。@JustinCave我刚才做的编辑怎么样。该查询的结果不应该告诉我导致行锁的会话吗?@c12-你有理由相信你发布的查询没有告诉你假设导致行锁的会话被定义为锁的持有者而不是请求者吗?您发布的脚本看起来有些过时-我更愿意使用v$session中的blocking_会话或dba_waiters或dba_blockers中的数据,除非您处理的是一个非常旧的Oracle版本,其中不存在这些列/对象。@JustinCave我使用的是11g,这样就可以了。选择*from v$session,其中blocking_session不为null似乎返回了我想要的结果。我运行了这两个查询,并在我的问题中发布了上述结果。根据这些结果,我似乎应该杀死55、104、145和92个。同意
holding_session
55
104
145
92
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
select blocking_instance,blocking_session from v$session where sid = <sid of session that is stuck hanging>;
SELECT *
FROM dba_blockers
SELECT *
FROM dba_waiters