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

事情源于一个朋友问到,他的生产库中出现很多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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9842/viewspace-850634/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值