【问题标题】:sqlplus stuck on delete querysqlplus 卡在删除查询上
【发布时间】:2015-06-13 06:06:53
【问题描述】:

我在使用由 SQL*Plus 启动的匿名 PL/SQL 块时遇到了一个奇怪的问题。此块包含删除语句,如果由 oracle sql 开发人员界面启动,它将按预期工作。如果我通过 sqlplus 从 cmd 启动它,它会卡住。 我发现删除语句是问题所在......我也遇到了同样的情况,代码更简单:

set serveroutput on size 1000000
begin
  DELETE FROM USER_LEAD;
  dbms_output.put_line('test');
end;
/
exit;

如果我删除 delete 语句,一切正常,并且与我真正的匿名块相同。我想指出我是唯一一个使用 db 的人,所以我认为该表没有被另一个用户/进程锁定。

有人遇到过这个问题吗?

【问题讨论】:

  • 听起来好像有什么东西在阻塞;不要想,检查 *8-)
  • 您可能在另一个会话中完成了一些 DML,而忘记了 COMMIT/ROLLBACK。所以,其他会话一直在等待。

标签: oracle session plsql oracle-sqldeveloper sqlplus


【解决方案1】:

这可能是一件很愚蠢的事情,但是,这种情况在大多数情况下都会发生。

  • 您在一个会话中执行 DML 事务。
  • 您尚未提交/回滚该会话。
  • 您打开另一个会话并执行另一个 DML。
  • 您发现查询一直在等待

您的案例中发生的事情的一个小演示:

第 1 次会议

SQL> delete from emp where empno = 7369;

1 row deleted.

第二场

SQL> delete from emp where empno = 7369;

会话 2 一直在等待。

让我们检查一下原因:

SQL> SELECT
  2     s.blocking_session,
  3     s.sid,
  4     s.serial#,
  5     s.seconds_in_wait
  6  FROM
  7     v$session s
  8  WHERE
  9     blocking_session IS NOT NULL;

BLOCKING_SESSION        SID    SERIAL# SECONDS_IN_WAIT
---------------- ---------- ---------- ---------------
             373        130      11069              44

SQL>

第 1 次会议

SQL> rollback;

Rollback complete.

SQL>

第二场

SQL> delete from emp where empno = 7369;

1 row deleted.

SQL>

会话 2 成功。

SQL> SELECT
  2     s.blocking_session,
  3     s.sid,
  4     s.serial#,
  5     s.seconds_in_wait
  6  FROM
  7     v$session s
  8  WHERE
  9     blocking_session IS NOT NULL;

no rows selected

SQL>

所以,没有更多的会话等待!

【讨论】:

    【解决方案2】:

    我找到了问题所在。

    我正在使用 sqlpus 从 cmd 执行匿名块,而我与 sql-developer 工具的会话仍处于打开状态。我关闭了与数据库的连接,一切都按预期工作。

    我想那个会话中有一些 DML,我没有提交/回滚。

    感谢@LalitKumarB 和@AlexPoole 提供的见解。

    【讨论】:

    • 所以我怀疑是对的。我已经发布了一个关于实际可能发生的事情的小演示。
    • 是的,你是对的@LalitKumarB。感谢您的详细解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2018-09-12
    • 2019-03-03
    相关资源
    最近更新 更多