oracle中的itl

转自:http://space.itpub.net/22830998/viewspace-660020 

概念
itl的全称是interested transaction list,是oracle中事物处理的关键组件。itl由xid,uba,flag,lck和scn/fsc组成。其最小值为1,由参数initrans控制(由于兼容性的原因,oracle会在对象的存储块分配两个itl,所以initrans的最小值实际上为2),最大值为255,由参数maxtrans控制,itl是block级的概念,一个itl占用块46B的空间,参数initrans意味着块中除去block header外一部分存储空间无法被记录使用(46B*initrans),当块中还有一定的free space时,oracle可以使用free space(回想下pctfree的含义)构建itl供事物使用,直到块中没有足够数量的free space或者块中实际的itl数量超过maxtrans。maxtrans和initrans可以使用alter语句进行修改,maxtrans参数的修改会对所有块生效,initrans参数的修改只对没有数据的块生效,可以思考下oracle为什么会这么处理。

事物和itl
事物要修改块中的数据,必须获得该块中的一个itl(通过initrans预先分配的或者是通过free space构建的)。通过itl和undo segment header中的transaction table,可以知道事物处于活动阶段,还是已经完成。事物在修改块时(其实就是在修改行)会检查行中row header中的标志位,如果该标志位为0(该行没有被活跃的事物锁住,这是可能要进行deferred block cleanout等工作),就把该标志位修改为事物在该块获得的itl的序号,这样当前事物就获得了对记录的锁定,然后就可以修改行数据了,这也就是oracle行锁实现的原理。

块清理
块清理分为两种:fast commit block cleanout and deferred block cleanout。延迟块清理在813之前可以通过一个参数进行配置,813之后延迟块清理成了oracle的一个特性,可以思考下oracle为什么把延迟块清理变成一个特性。
块清理清除itl中的标志位,行中row header中的标志位等,块清理也是select语句产生redo的主要原因

你可能感兴趣的:(oracle中的itl)