我有一个 Oracle DB 包,它经常导致我认为是 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
此表上没有位图索引,所以这不是原因。据我所知,缺少“等待的行”加上等待列中的“S”可能表明这是一个 ITL 死锁。此外,该表的写入频率很高(大约同时插入或更新 8 次,每分钟最多 240 次),因此 ITL 死锁似乎很有可能。
我已将表的 INITRANS 参数及其索引增加到 100,并将表上的 PCT_FREE 从 10 增加到 20(然后重建索引),但死锁仍在发生。死锁似乎最常发生在更新期间,但这可能只是巧合,因为我只追踪了几次。
我的问题有两个:
1)这实际上是一个 ITL 死锁吗?
2)如果是ITL死锁,还有什么办法可以避免呢?
事实证明,这根本不是 ITL 死锁问题,而是未索引外键的问题。由于 dpbradley 的回答,我发现了这一点,这让我知道这不是 ITL 问题,并促使我找出“无行”死锁的其他原因可能是什么。