与多个用户一起测试我的应用程序时,我遇到了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”,所以我可以绝对确定地告诉您,这是由于到外键关系,其中引用表(子表)列未建立索引。如果您寻找未索引的外键并添加索引,则此问题应消失。
希望能有所帮助。
PS我的演示文稿“了解和解释死锁,或如何处理ORA-00060”可在OakTable网站http://www.oaktable.net上下载。在“贡献的文件”部分中查找。