与 Oracle 的 SAS 连接挂起 2 小时
SAS connection to Oracle hung up for 2 hours
在 SAS 中,我们有一个实际上是 ORACLE 模式的库,今天我在尝试查询该库中的 table 时遇到了一个奇怪的事件。
常规 SAS SQL 查询:
proc sql;
delete from table where id=123;
quit;
被挂断了两个小时,而通常只需要几秒钟:
NOTE: PROCEDURE SQL used (Total process time):
real time 2:00:33.49
cpu time 0.03 seconds
在执行此操作时,我试图在 ORACLE SQL DEVELOPER 中删除附近的一行,但它也挂断了处理删除请求。然而,删除不在这些行附近的行不会导致任何问题。那么我怎样才能找出可能的原因呢?我想那是一种僵局。
听起来有人锁定了您的会话正试图删除的行。您应该能够通过查询 v$session:
来发现这一点
select sid, schemaname, osuser, terminal, program, event
from v$session
where type != 'BACKGROUND';
并检查您的会话是否有 "enq: TX - row lock contention" 事件(或类似事件)。如果是这样,那么您将不得不找出谁拥有阻塞锁(如果您可以访问 Toad 的会话浏览器,这很容易做到,但是 Google 应该提供一些可以提供帮助的东西。或者,如果您的数据库是 Oracle 11.2,有一个视图:v$session_blockers 应该查明阻塞会话),然后让他们提交或回滚他们的事务。
在 SAS 中,我们有一个实际上是 ORACLE 模式的库,今天我在尝试查询该库中的 table 时遇到了一个奇怪的事件。 常规 SAS SQL 查询:
proc sql;
delete from table where id=123;
quit;
被挂断了两个小时,而通常只需要几秒钟:
NOTE: PROCEDURE SQL used (Total process time):
real time 2:00:33.49
cpu time 0.03 seconds
在执行此操作时,我试图在 ORACLE SQL DEVELOPER 中删除附近的一行,但它也挂断了处理删除请求。然而,删除不在这些行附近的行不会导致任何问题。那么我怎样才能找出可能的原因呢?我想那是一种僵局。
听起来有人锁定了您的会话正试图删除的行。您应该能够通过查询 v$session:
来发现这一点select sid, schemaname, osuser, terminal, program, event
from v$session
where type != 'BACKGROUND';
并检查您的会话是否有 "enq: TX - row lock contention" 事件(或类似事件)。如果是这样,那么您将不得不找出谁拥有阻塞锁(如果您可以访问 Toad 的会话浏览器,这很容易做到,但是 Google 应该提供一些可以提供帮助的东西。或者,如果您的数据库是 Oracle 11.2,有一个视图:v$session_blockers 应该查明阻塞会话),然后让他们提交或回滚他们的事务。