事情源于一个朋友问到,他的生产库中出现很多enqueue等待。重启应用后没多久,又出现这些等待。于是,我先让他执行以下语句,先找到enqueue的mode和name:
select sid,
chr(bitand(p1, -16777216)/16777215) ||
chr(bitand(p1,16711680)/65535) "Name",
(bitand(p1, 65535)) "Mode"
from v$session_wait
where event = 'enqueue';
然后他告诉我,mode为4,name为TX。
这是基本上可以确定应该是由于ITL过低而引起的。ITL由两个参数决定:init trans和max trans。通常table的max trans为255,应该不会超过。而init trans缺省是2,该值在并发性较大的table上显然不够用。所以我告诉他,应该是init trans过低引起的。
如何证明?我想,两种方法:一种是让3个人同时喊一、二、三,大家同时更新同一个表的同一个block里的不同行。这实现起来比较麻烦。还有一种方法就是将max trans降低,比如降低到3。然后开4个session去更新同一个表的同一个block里的不同行。应该可以复现这种情况。
SQL> create table t as select object_name,object_type from user_objects where rownum<10;
表已创建。
SQL> alter table t maxtrans 3;
表已更改。
SQL> select ini_trans,max_trans from user_tables where table_name='T';
INI_TRANS MAX_TRANS
---------- ----------
1 3
然后开4个session,分别提交以下sql语句:
SQL> update t set object_type='aaa' where object_name='ADD_JOB_HISTORY';
已更新 1 行。
可以发现第四个session发生等待。于是再开第五个session,运行如下sql:
select sid,
chr(bitand(p1, -16777216)/16777215) ||
chr(bitand(p1,16711680)/65535) "Name",
(bitand(p1, 65535)) "Mode"
from v$session_wait
where event = 'enqueue';
SID Name Mode
---------- ---- ----------
10 TX 4
从而可以复现该现象,从而从侧面证明,由于ITL过低会导致mode为4,name为TX的enqueue等待。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9842/viewspace-850634/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9842/viewspace-850634/