如何找出Oracle死锁的原因

时间:2013-12-09 16:00:15

标签: sql oracle database-deadlocks

在测试多个用户的应用程序时,遇到了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;

我在完全不同的表上获得了主键的名称!这可能是发生僵局的原因吗?

1 个答案:

答案 0 :(得分:8)

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

希望有所帮助....

P.S。我的演示文稿“理解和解释死锁,或者如何处理ORA-00060”可以在OakTable网站http://www.oaktable.net下载。查看“参与文件”部分。