删除死锁而不杀死会话

时间:2009-11-28 09:29:29

标签: oracle session deadlock

是否有任何解决方法可以在不中断会话的情况下删除死锁?

3 个答案:

答案 0 :(得分:6)

来自Concepts Guide

  

Oracle自动检测死锁情况并通过回滚死锁中涉及的一个语句来解决它们,从而释放一组冲突的行锁。

您无需执行任何操作来消除死锁,Oracle会自动处理死锁。会话未被终止,它会回滚到触发器语句之前的某个点。另一个会话不受影响(即,在回滚会话提交或回滚其事务之前,它仍然等待锁定。)

在大多数情况下,死锁应该非常罕见。您可以使用FOR UPDATE NOWAIT语句而不是FOR UPDATE来阻止所有死锁。

另见

  

Discussion about removing deadlock on AskTom

答案 1 :(得分:1)

通过取消其中一个锁定的语句,Oracle中会自动清除死锁。您无需手动执行此操作。其中一个会话将获得“ORA-00060”,它应该决定是重试还是回滚。

但是从你的描述看起来你看起来像是一块,而不是死锁。

无论如何,阻塞会话应以某种方式释放其锁定 - 通过提交或回滚其事务。你可以等待它(可能很长一段时间)。如果您可以更改应用程序的代码 - 您可能可以重写它以释放锁定或避免它。否则,您必须终止会话以立即解锁资源。

答案 2 :(得分:-1)

不,Oracle 10g似乎无法在实践中自动解决死锁问题。我们确实有了交易,我们必须手动清除会话。

此页面可帮助您确定是否存在死锁 Identifying and Resolving Oracle ITL Deadlock