ITPub博客

首页 > 应用开发 > IT综合 > 模拟mode=4 and name='TX'的enqueue

模拟mode=4 and name='TX'的enqueue

原创 IT综合 作者:hanson 时间:2019-06-17 07:12:07 0 删除 编辑

事情源于一个朋友问到,他的生产库中出现很多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';

[@more@]

然后他告诉我,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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2002-04-14

  • 博文量
    54
  • 访问量
    40728