识别和解决Oracle ITL死锁

All*_*lan 6 oracle oracle10g database-deadlocks

我有一个Oracle数据库软件包,它经常导致我认为是ITL(感兴趣的事务列表)的死锁.跟踪文件的相关部分如下所示.

Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TM-0000cb52-00000000        22     131           S       23     143          SS
TM-0000ceec-00000000        23     143    SX             32     138    SX   SSX
TM-0000cb52-00000000        30     138    SX             22     131           S
session 131: DID 0001-0016-00000D1C session 143: DID 0001-0017-000055D5
session 143: DID 0001-0017-000055D5 session 138: DID 0001-001E-000067A0
session 138: DID 0001-001E-000067A0 session 131: DID 0001-0016-00000D1C
Rows waited on:
Session 143: no row
Session 138: no row
Session 131: no row
Run Code Online (Sandbox Code Playgroud)

此表上没有位图索引,因此不是原因.据我所知,缺少"行等待"加上Waiter等待列中的"S"可能表明这是ITL的死锁.此外,该表经常被写入(大约8次插入或同时更新,通常每分钟240次),因此ITL死锁似乎很有可能.

我增加了表的INITRANS参数,它的索引为100,并将表上的PCT_FREE从10增加到20(然后重建了索引),但死锁仍在发生.在更新期间,僵局似乎最常发生,但这可能只是巧合,因为我只追踪了几次.

我的问题有两方面:
1)这实际上是ITL的僵局吗?
2)如果是ITL死锁,还有什么办法可以避免它?


事实证明,这根本不是ITL死锁问题,而是未编入索引的外键问题.我发现这要归功于dpbradley的回答,这让我想到这不是一个ITL问题,并促使我找出导致"无行"死锁的其他原因.

dpb*_*ley 5

ITL压力的最佳指标来自绩效观点:

select event, total_waits, time_waited, average_wait
 from v$system_event
 where event like 'enq: TX%'
 order by 2 desc;
Run Code Online (Sandbox Code Playgroud)

显示TX争用等待,和

select OBJECT_NAME, SUBOBJECT_NAME, TABLESPACE_NAME, 
       OBJECT_TYPE, STATISTIC_NAME, VALUE
  from v$segment_statistics 
  where statistic_name = 'ITL waits'
  and value > 0
  order by value desc;
Run Code Online (Sandbox Code Playgroud)

显示涉及的表和索引.

(与所有v$视图一样,结果来自实例启动的时间点.)

如果这说明你确实有ITL等待,那么INITRANS和PCTFREE参数是将主旋钮(但INITRANS = 100听起来相当高,我和这些做成本空间).

如果ITL等待不是问题,则需要检查应用程序代码.