![Oracle 数据库死锁](https://linux22.com/image/794902/Oracle%20%E6%95%B0%E6%8D%AE%E5%BA%93%E6%AD%BB%E9%94%81.png)
我们遇到了数据库“变慢”的情况。通常需要一两秒的数据库操作现在需要十倍的时间。发生这种情况时,数据库中似乎有大量锁定。大量死锁是否会导致整个数据库速度缓慢?
答案1
死锁是一种特殊情况,事务 A 拥有一个锁,然后尝试锁定当前由事务 B 锁定的某项,并且必须等待。然后事务 B 尝试锁定当前由事务 A 锁定的项目。数据库“注意到”这种情况无法自然解决,因此其中一个事务出错并强制其回滚。
正如其他人所说,这是不寻常的,我希望您能收到有关死锁的应用程序错误报告。
相反,我猜“某些东西”发生了变化。可能是锁,但也可能是因为事务耗时更长(因此锁被持有的时间更长),所以锁定了更多东西。
如果您使用的是带有 AWR/ASH(诊断/调优包)的 10g/11g,OEM 应该能够帮助诊断情况。
如果没有,请查看 V$SESSION,看看是否有很多会话设置了 BLOCKING_SESSION。这表明它们正在等待锁。只有会话正在等待锁时才需要担心锁,因此请使用这个而不是锁的数量。如果这不表示存在问题,请转到 v$session_event,看看哪些 wait_class 条目占了大部分时间。
答案2
这可能是死锁,但数据库通常可以判断何时出现死锁,并且在这种情况下会通过死锁异常终止连接。
我在我的 Oracle 数据库中看到过这种情况,当资源不足,数据库内存不足并且必须交换到磁盘时就会发生这种情况。
如果许多作业都在队列中等待同一资源释放,则尤其如此。
答案3
死锁记录在跟踪文件中,因此您可以轻松判断是否是此问题。首先分析常见的嫌疑。查询解释计划、索引、统计数据等。