Oracle数据库在UPDATE查询中无限挂起。

13

突然间我的更新查询无法执行。我可以执行选择查询,但当我尝试更新记录时,数据库会无限挂起。我甚至尝试从sql plus执行,也没有任何反应。


1
请问,您能更具体一些吗?我们无法猜测您的系统出现了什么问题。您知道什么?您检查过什么?您的系统是如何工作的,有多少用户等等...?更新查询是什么样子的?在同时运行的相同表上运行了什么类型的DML? - Lukas Eder
你能正常注销并重新登录吗?你处于ARCHIVELOG模式吗?你在另一个会话中有未提交的更改锁定了当前的更新吗?提供更多信息会更有帮助... - Ollie
2个回答

38

很可能你有另一个未提交的事务正在处理相同记录集,因此它们被该事务锁定。

而且,很可能是UPDATE在另一个事务中执行时被锁定了相同的记录。

请提交或回滚你的事务,这样应该就没问题了。


3
那个回答我称之为“有根据的猜测”;-) - Lukas Eder
5
可以的。是的,没错。当你在某个领域待了一段时间并教授初学者时,你会感受到一种“原力强”的气息,知道他们遇到的问题,甚至在他们告诉你之前就已经了解了。但当然,并不总是正确的。 - Adriano Carneiro
我知道那种感觉。它很适合“不再说话,只是观察” :) - Lukas Eder
1
五年后...你为我节省了大量时间。我写了一个带有查询的Python脚本,但无法弄清为什么执行时会挂起,但在阅读这篇文章后,我意识到我在SQL Developer中测试查询后没有提交。谢谢! - McGlothlin
1
啊,谢谢!这也救了我!我正在 SQL Developer 中测试查询语句,认为我已经提交了所有内容,但仍有未提交的内容。一旦我断开与 SQL Developer 的连接,它就会询问是否提交更改,在断开连接后我的 Python 脚本就可以工作了 :) - sofly

21

这个查询将显示谁阻塞了你的更新。 执行导致挂起的更新,然后在另一个会话中运行以下查询:

select s1.username || '@' || s1.machine ||
  ' ( SID=' || s1.sid || ' )  is blocking '
  || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
  from v$lock l1 join v$lock l2 on (l1.id1 = l2.id1 and l2.id2 = l2.id2) 
                 JOIN v$session s1 ON (s1.sid = l1.sid)
                 JOIN v$session s2 ON (s2.sid = l2.sid)
  WHERE l1.BLOCK=1 and l2.request > 0;

编辑:

为了正确地进行归属,看起来我之前从ORAFAQ cribbed 这个一段时间。


1
我经常使用它。但愿我能记得在哪里找到它。可能是Tom Kyte的特别之处。更新:我想我在这里找到了它:http://orafaq.com/node/854 - DCookie
1
我们如何停止或终止产生的任务? - user3141985
1
这里有一篇不错的文章:https://oracle-base.com/articles/misc/killing-oracle-sessions - DCookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接