gpt4 book ai didi

sql - 如何找出导致 Oracle 死锁的原因

转载 作者:行者123 更新时间:2023-12-04 22:12:03 26 4
gpt4 key购买 nike

在多用户测试我的应用程序时,我遇到了 ORA-00060 死锁错误。我不确定如何确定此错误的原因,因此如果有人可以帮助我,将不胜感激。

我查看了为此事件生成的跟踪文件,它显示了是哪个查询导致了这个:

UPDATE TABLE_A SET CK=CK+1 WHERE A_ID=(
SELECT A_ID FROM TABLE_B WHERE SOME_COLUMN=:SOMECOLUMN
)

它还生成了这个:
[Transaction Deadlock]

The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:

Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0002a675-00000000 51 200 SX SSX 52 22 SX SSX
TM-0002a675-00000000 52 22 SX SSX 51 200 SX SSX

session 200: DID 0001-0033-0000014A session 22: DID 0001-0034-0000005A
session 22: DID 0001-0034-0000005A session 200: DID 0001-0033-0000014A

Rows waited on:
Session 200: obj - rowid = 0002A6B1 - AAAqaxAAUAAAAFTAAA
(dictionary objn - 173745, file - 20, block - 339, slot - 0)
Session 22: obj - rowid = 0002A6B1 - AAAqaxAAUAAAAFTAAA
(dictionary objn - 173745, file - 20, block - 339, slot - 0)

如何使用上述信息找出问题的原因? TABLE_A 或 TABLE_B 上没有任何未编入索引的外键(我认为这通常是导致此类错误的原因)。

当我运行此查询时:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE 
FROM DBA_OBJECTS
WHERE OBJECT_ID = 173745;

我在一个完全不同的表上得到主键的名称!这可能是导致死锁发生的线索吗?

最佳答案

因为所涉及的入队是一个“TM”入队,并且因为持有锁的模式是“SX”,而锁等待的模式是“SSX”,我可以绝对肯定地告诉你,这是由于到外键关系,其中引用表(子表)列未编入索引。如果您查找未索引的外键并添加索引,此问题应该会消失。

希望有帮助....

附言我的演示文稿“理解和解释死锁,或如何处理 ORA-00060”,可在 OakTable 站点下载,http://www.oaktable.net .查看“贡献的文件”部分。

关于sql - 如何找出导致 Oracle 死锁的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20474959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com