为什么我得到这个数据库错误时,我更新表?

第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取


当前回答

我设法击中这个错误时,只是简单地创建一个表!在一个还不存在的表上,显然不存在争用问题。CREATE TABLE语句包含一个约束fk_name FOREIGN KEY子句,引用一个填充良好的表。我不得不:

从CREATE TABLE语句中删除外键子句 在FK列上创建一个INDEX 创建FK

其他回答

您的表已经被某个查询锁定。例如,您可能已经执行了“select For update”,但尚未提交/回滚并触发另一个选择查询。在执行查询之前执行一次提交/回滚。

这个问题有一个很简单的解决办法。

如果你在会话上运行10046跟踪(谷歌this…太多了,无法解释)。在任何DDL操作之前,Oracle会执行以下操作:

锁定表“table_name”不等待

因此,如果另一个会话有一个打开的事务,就会得到一个错误。所以解决办法是……请击鼓。在DDL之前发出您自己的锁,并省略'NO WAIT'。

特别注意:

如果你正在分割/删除分区,oracle只是锁定分区。 你可以锁定分区子分区。

所以… 下面的步骤可以解决这个问题。

锁定表'表名';你会“等待”(开发者称之为挂起)。直到具有打开事务的会话提交为止。这是一个队列。所以在你之前可能会有几个疗程。但是你不会出错。 执行DDL。然后DDL将使用NO WAIT运行一个锁。但是,您的会话已经获得了锁。所以你很好。 DDL自动提交。这就释放了锁。

当表被锁定时,DML语句将“等待”或开发人员称之为“挂起”。

我在从作业运行以删除分区的代码中使用了这个功能。它工作得很好。它位于一个以每秒几百个插入的速度不断插入的数据库中。没有错误。

如果你想知道的话。用11g做这个。我以前也用10g做过这个。

您的问题看起来像是混合了DML和DDL操作。请看这个URL,它解释了这个问题:

http://www.orafaq.com/forum/t/54714/2/

就我而言,我很确定这是我自己的一个会话阻塞了。因此,这样做是安全的:

我发现了这个令人不快的环节: SELECT * FROM V$SESSION WHERE OSUSER='my_local_username' 会话处于非活动状态,但它仍然以某种方式持有锁。注意,在你的情况下,你可能需要使用一些其他的WHERE条件(例如,尝试USERNAME或MACHINE字段)。 使用上面获取的ID和SERIAL#杀死会话: 修改系统会话id为>,序列号为>

由@thermz编辑:如果前面的开放会话查询都不起作用,请尝试这个查询。这个查询可以帮助你在杀死会话时避免语法错误:

SELECT 'ALTER SYSTEM KILL SESSION ''||SID||','||SERIAL#||'' immediate;' FROM V$SESSION WHERE OSUSER='my_local_username_on_OS'

我有这个错误发生时,我有2个脚本,我正在运行。我有:

SQL*Plus会话直接使用模式用户帐户(帐户#1)连接 另一个SQL*Plus会话使用不同的模式用户帐户(帐户#2)连接,但作为第一个帐户跨数据库链接连接

我运行了一个表删除,然后创建表作为帐户#1。 我对账号2的会话进行了表更新。没有提交更改。 以帐户#1的身份重新运行表删除/创建脚本。删除表x命令出错。

我通过运行COMMIT来解决这个问题;在账号#2的SQL*Plus会话中。