发表于: 2008.01.30 23:18
分类: ORACLE
出处: http://fbirdzp.itpub.net/post/5714/453801
---------------------------------------------------------------
这里真是感叹论坛上活跃的ORACLE大拿们,解惑不少!现在总结一下自己从别人那学到的东西,化为己用,对自己也是提高!
initrans是怎样定义的?
initrans:Specifies the number of transaction entries preallocated in each block. (The default and the minimum value is two.)
大概的意思就是分配给每个db block的初始的最小并发事务数。英语不太好啊!
我们知道,在对TABLE做DML操作时,实际上访问数据文件的block块。
DB BLOCK的物理结构里包括一个Transaction Header的部分,是为Transaction层提供信息的。其中一部分就是定义ITS(即Interested Transaction Slot)。Interested Transaction List (ITL)是由一系列的Interested Transaction Slot (ITS)组成的。
从dump block产生的trc文件可以看到关于ITL部分的定义(枯燥的16进制码就不多钻研了),如下:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.017.000c4d31 0x00800613.c1bb.14 ---- 734 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
可以看到这里分配了2个ITL。
每一个Transactions访问block块时,都需要通过ITL分配一个入口,INITRANS 决定初始的ITL数量,在block有足够空间进行分配时,oracle根据需要动态分配ITL,或者当达到MAXTRANS时也就停止分配了。
当存在大量的并发transactions同时访问一个block时,如果block上没有足够的空间分配新的ITL, 此时超过部分的transactions就会出现wait或是lock
进行create table操作时,如果没有特别指定,一般默认initrans初始值为2,maxtrans值为255。
9i版本可以定义maxtrans,但最大为255;
ORACLE10g版本默认maxtrans就是255,且修改无效始终为255。
另外需要注意的是,修改initrans值后,只是对新增的数据起作用,访问原来的block或是这个表基本没有增量,就会没有什么效果。这也是我们的应用在修改了表的initrans仍然不能解决row lock的问题。











