ORACLE ITL事务槽

讲到ITL(事务槽)一定先说数据块,那么什么是数据块呢?先给你们上一个数据块结构图html

数据块分别由块头、ITL(事务槽)、表信息区、行信息区、块空闲区、行数据区组成,其中ITL用来记录在数据块发生的全部业务,简单通俗的讲你在数据库对一张表进行操做,都会记录在数据块中,表与数据块是一一对应的关系。数据库

在行数据区是从下到上执行的,当执行DML语句时候,行数据区会在下方创建一个新的数据区,事务提交的时候,原先的数据会被unused。而后新数据块替换旧数据块。oracle

ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块全部发生的事务,一个itl能够看做是一条事务记录。固然,若是这个事务已经提交,那么这个itl的位置就能够被反复使用了,由于itl相似记录,因此,有的时候也叫itl槽位。若是一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回滚段的入口,事务类型等等。若是这个事务已经提交,那么,itl槽位中还保存的有这个事务提交时候的SCN号。

spa

如需看具体的ITL文件信息,定位到udump文件进行查看数据块头文件的变化。.net

ITL知识点对于一个初学dba只要记住两点。rest

1、ITL重用后如何实现前ITL读一致性htm

 

   ORACLE经过ITL条目中记录的回滚段地址找到回滚段,实现读一致性,若是事务已提交,ITL就能够被重用,可是若前一个ITL被重用,前一个ITL的读一致性是如何实现的呢?

     假定block只有一个itl,假定第一个事务的时候产生了 ITL-0

     第二个事务来了,产生了 ITL-1 ,ITL-1 里面的UBA 能够找到回滚段地址,回滚段中除了记录了 block用户数据的 before image 外还记录了  ITL-0 的信息。

     第三个事务来了,产生了 ITL-2  , ITL-2 中 UBA 指向回滚段,回滚段中 也记录了 ITL-1 的信息。

     这样当一个查询若须要ITL-0时候的信息,则找到当前block,发现是 ITL-2 ,根据UBA找到回滚段进行 roll 获得  变化前 block ,这个时候发现block中是 ITL-1 . 还不能知足需求。 因而再根据 ITL-1 中的 UBA 又去回滚段中找到数据来进行roll,获得一个block 数据,这个时候block中就有了 ITL-0。

     经过根据当前ITL进行递归的方式找到数据,实现以前ITL的独一致性。
2、行锁原理blog

Oracle的锁机制是一种轻量级的锁定机制,不是经过构建锁列表来进行数据的锁定管理,而是直接将锁做为数据块的属性,存储在数据块首部。这个是经过ITL来实现的,一个事务要修改块中的数据,必须得到该块中的一个itl(经过initrans预先分配的或者是经过free space构建的)。经过itl和undo segment header中的transaction table,能够知道事务处于活动阶段,仍是已经完成。事务在修改块时(其实就是在修改行)会检查行中row header中的标志位,若是该标志位为0(该行没有被活动的事务锁住,这是可能要进行deferred block cleanout等工做),就把该标志位修改成事务在该块得到的itl的序号,这样当前事务就得到了对记录的锁定,而后就能够修改行数据了,这也就是oracle行锁实现的原理。

递归

了解更多锁知识点:http://www.javashuo.com/article/p-ehbvlcpq-gg.html事务

参考资料:https://blog.csdn.net/gyb2013/article/details/6893639

     http://www.javashuo.com/article/p-hsoohxah-cn.html

相关文章
相关标签/搜索