1 概述:
Tx锁等待在数据库中常见,今天说说一个关于 Enq:Tx – index contention等待案例的。
关于TX锁,常见的等待有以下几个,其中 enq: TX - index contention 的等待类型 Concurrency,不是 Application。也就是说这个等待是一个并发等待,但是不是应用程序导致的锁。
enq: TX - row lock contention enq: TX - allocate ITL entry enq: TX - index contention enq: TX - contention |
2 现象:
数据库会话告警,超过阀值。1分钟内恢复。 V$SESSION中,存在大量 enq: TX - index contention的等待
通过sql_id,我们可以知道这个sql语句类似如下,是一个INSERT语句
INSERT INTO T1 VALUES( S_1.NEXTVAL, ……………………);
|
通过查询对象,可以发现等待的对象时T表的主键
3 问题分析:
Insert 数据,发现主键等待。仔细分析了业务场景,存在这样的一种业务:在很短的时间内,大量在T表内INSERT数据,那么由于主键是自增长的,很短的时间数据全部写入一个或者几个索引块,导致了索引则争用。
这种情况,oracle数据库在子自增长主键,如果insert非常繁忙是存在的,现有的解决方案也非常简单,如果不需要按照主键范围搜索,那么就做一个反向索引,让相似的值反向后,落到不同的索引块中,减缓这种并发。
由于是线上系统,主键不能删除,只能重建
ALTER INDEX PK_T REBUILD ONLINE REVERSE; |
4 问题解决
在测试环境中,复现了上述现象,并且重建索引,问题解决。正式环境处理,问题解决
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/617982/viewspace-1448263/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/617982/viewspace-1448263/