oracle - 识别和解决 Oracle ITL 死锁

标签 oracle oracle10g database-deadlocks

我有一个 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 问题,并促使我找出“无行”死锁的其他原因可能是什么。

最佳答案

ITL 压力的最佳指示来自性能 View :

select event, total_waits, time_waited, average_wait
 from v$system_event
 where event like 'enq: TX%'
 order by 2 desc;

显示 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;

显示所涉及的表和索引。

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

如果这表明您确实有 ITL 等待,那么 INITRANS 和 PCTFREE 参数是要转动的主要旋钮(但 INITRANS = 100 对我来说听起来非常高,而且这些确实会占用空间)。

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

关于oracle - 识别和解决 Oracle ITL 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899087/

相关文章:

java - 如何正确处理 Java/JDBC 中的 InnoDB 死锁?

mysql - 分组并选择最大对 SQL

oracle - 带有 substr 的多个 CASE/WHEN

c# - 如何引用不同的模式而不对其进行硬编码

postgresql - 没有显式锁定的postgres死锁

MySQL:如何查找被事务锁定的行

sql - 如何计算 Oracle varchar 值中某个字符的出现次数?

sql - 我们可以在 Oracle SQL 函数中有 commit 语句吗

Oracle 解释计划估计索引范围扫描的基数不正确

sql - Oracle 的解释计划有多准确?