一、ITL描述:

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

ITL个数其最小值为1,由参数initrans控制(由于兼容性的原因,oracle会在对象的存储块分配两个itl,所以initrans的最 小值实际上为2),最大值为255,由参数maxtrans控制,最大值参数在10g以后不能被修改,itl是block级的概念,一个itl占用块 46B的空间,参数initrans意味着块中除去block header外一部分存储空间无法被记录使用(46B*initrans),当块中还有一定的free space时,oracle可以使用free space构建itl供事务使用,如果没有了free space,那么,这个块因为不能分配新的itl,所以就可能发生itl等待。
如果在并发量特别大的系统中,最好分配足够的itl个数,其实它并浪费不了太多的空间,或者,设置足够的pctfree,保证itl能扩展,但是pctfree有可能是被行数据给消耗掉的,如update,所以,也有可能导致块内部的空间不够而导致itl等待。

dump一个块可以看到ITL信息类似如下:
     Itl           Xid                                    Uba                            
Flag      Lck        Scn/Fsc
    0x01   0x0006.002.0000158e  0x0080104d.00a1.6e   --U-   734    fsc 0x0000.6c9deff0
    0x02   0x0000.000.00000000  0x00000000.0000.00  ----        0       fsc 0x0000.00000000

Xid:事务id,在回滚段事务表中有一条记录和这个事务对应

Uba:回滚段地址,该事务对应的回滚段地址

第一段地址:回滚数据块的地址,包括回滚段文件号和数据块号

第二段地址:回滚序列号

第三段地址:回滚记录号

SELECT UBAFIL 回滚段文件号,UBABLK 数据块号,UBASQN 回滚序列号,UBAREC 回滚记录号 FROM v$transaction --查看UBA

Flag:事务标志位。这个标志位就记录了这个事务的操作,各个标志的含义分别是:

----- = 事务是活动的,或者在块清除前提交事务

C--- = 事务已经提交并且清除了行锁定。

-B-- = this undo record contains the undo for this ITL entry

--U- = 事务已经提交(SCN已经是最大值),但是锁定还没有清除(快速清除)。

---T =当块清除的SCN被记录时,该事务仍然是活动的,块上如果有已经提交的事务,那么在clean ount的时候,块会被进行清除,但是这个块里面的事务不会被清除。

Lck:影响的记录数

Scn/Fsc:快速提交(Fast Commit Fsc)的SCN或者Commit SCN。

每条记录中的行级锁对应于Itl列表中的序号,即哪个事务在该记录上产生的锁。

 二、ITL等待

发生等待的场景:

1.超过maxtrans配置的最大ITL数

2.initrans不足,没有足够的free space来扩展ITL

解决方法:

1.maxtrans不足:这一情况是由高并发引起的:同一数据块上的事务量已经超出了其实际允许的ITL数。因此,要解决这类问题就需要从应用着手,减
少事务的并发量;长事务,在保证数据完整性的前提下,增加commit的频率,修改为短事务,减少资源占用事件。而对于OLAP系统来说(例如,其存在高
并发量的数据录入模块),可以考虑增大数据块大小。

2.initrans不足:数据块上的ITL数量并没有达到MAX
TRANS的限制,发生这种情况的表通常会被经常UPDATE,从而造成预留空间(PCTFREE)被填满。如果我们发现这类ITL等待对系统已经造成影
响,可以通过增加表的INITRANS或者PCTFREE来解决(视该表上的并发事务量而定,通常,如果并发量高,建议优先增加INITRANS,反之,
则优先考虑增加PCTFREE)。

  要注意的一点是,如果是使用ALTER TABLE的方式修改这2个参数的话,只会影响新的数据块,而不会改变已有数据的数据块——要做的这一点,需要将数据导出/导入、重建表。

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

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的独一致性。

行锁原理:

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

oracle ITL(事务槽)的理解的更多相关文章

  1. ORACLE ITL事务槽

    讲到ITL(事务槽)必定先说数据块,那么什么是数据块呢?先给大家上一个数据块结构图 数据块分别由块头.ITL(事务槽).表信息区.行信息区.块空闲区.行数据区组成,其中ITL用来记录在数据块发生的所有 ...

  2. Oracle ITL(Interested Transaction List)理解

    ITL(Interested Transaction List) ITL是位于数据块头部的事物槽列表,它是由一系列的ITS(Interested Transaction Slot,事物槽)组成,其初始 ...

  3. MySQL表结构,表空间,段,区,页,MVCC ,undo 事务槽

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

  4. Oracle之事务

    一,oracle的事务: 是指对数据操作的一系列动作的统称.即:事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的. 事务有四大特性(ACID): 1,原子性(a ...

  5. Oracle一个事务中的Insert和Update执行顺序

    今天碰到了一个奇怪的问题,是关于Oracle一个事务中的Insert和Update语句的执行顺序的问题. 首先详细说明下整个过程: 有三张表:A,B,C,Java代码中有一段代码是先在表A中插入一条数 ...

  6. 数据库事务隔离级ORACLE数据库事务隔离级别介绍

    本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...

  7. [转]了解oracle自治事务

    http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...

  8. ORACLE时间函数(SYSDATE)深入理解

    ORACLE时间函数(SYSDATE)深入理解 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add ...

  9. 浅述Oracle分布式事务概念

    着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...

随机推荐

  1. thinkphp mysql和mongodb 完美使用

    thinkphp mysql和mongodb 完美使用.第一步:在你的应用的Model文件下建立一个MonModel如下图第二步:MonModel的内容如下 <?php /** * Create ...

  2. 【C#】教你纯手工用C#实现SSH协议作为GIT服务端

    SSH(Secure Shell)是一种工作在应用层和传输层上的安全协议,能在非安全通道上建立安全通道.提供身份认证.密钥更新.数据校验.通道复用等功能,同时具有良好的可扩展性.本文从SSH的架构开始 ...

  3. 【pushlet学习】具体实战

    业务需求: 1. 前端界面需要实时显示空调.照明等设备的状态, 如:空调电压.空调电流.光照强度等,这些量每一个称作一个测点: 2. 不同的用户登录系统后,用户只能看到自己设备的运行状态,而看不到其他 ...

  4. [转] oracle 数据库 SQL plus 连接方法

    http://hi.baidu.com/zzy382/item/a5b197f97a38e01ba7298832 之前电脑上安装了一个 Oracle  有一段时间没用,就把密码给忘了,按上面链接里的操 ...

  5. Python 示例 饮水记录

    因为每天都需要喝水  这是非常重要的 目录结构: ├─bin│ │ start.py│ ││ └─__pycache__│ start.cpython-36.pyc│├─core│ │ src.py│ ...

  6. 关于cookie的一些事

    关于cookie的一些事转自:http://blog.csdn.net/yunnysunny/article/details/7748106 cookie是实现web中用户状态维护的基础.我们常见的s ...

  7. 如何捕捉@tornado.gen.coroutine里的异常

    from tornado import gen from tornado.ioloop import IOLoop @gen.coroutine def throw(a,b): try: a/b ra ...

  8. 基于标准库实现string和wstring的转换

    // convert string to wstring std::wstring to_wstring(const std::string& str, const std::locale&a ...

  9. Hibernate 一对一

    一对一关系映射: 一对一关系映射即关系双方都只含有对方的一个引用(eg:人和身份证) 一对一关系映射又分为唯一外键关联映射和主键关联映射 数据库表结构: 创建实体类: public class Per ...

  10. 洛谷P1415 拆分数列

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...