`
trophy
  • 浏览: 178469 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Oracle ITL(事务槽)

 
阅读更多

ITL描述:

ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),一个itl可以看作是一条事务记录。当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了。如果这个事务已经提交,那么,itl槽位中还保存的有这个事务提交时候的SCN号。

ITL个数其最小值为1,由参数initrans控制(由于兼容性的原因,oracle会在对象的存储块分配两个itl,所以initrans的最小值实际上为2),最大值为255,由参数maxtrans控制,最大值参数在10g以后不能被修改,当块中还有一定的free space时,oracle可以使用free space构建itl供事务使用,如果没有了free space,那么,这个块因为不能分配新的itl,所以就可能发生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读一致性

     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采用只更新undo segment header的事务信息,而数据块头部的信息不更新,或者进行少量更新。可见,事务信息最具可信度的当属undo段头部的事务表了,它里面的事务信息最真实的反应了事务的状态。这也是为什么有时候select也会产生redo的原因。

    数据行被T1加锁,T2要修改数据行时,发现有锁定标志,就到ITL中找到T1,查看Flag,此时有两种情况:

    1)已提交:那么T2会把数据行的行头锁给削掉(通常锁是不会被及时清除的),这个行为会产生redo,然后再访问数据行。

    2)未提交:如果是未提交,T2就会怀疑了,是不是真的?因为他不相信T1,此时,他秉承“绝知此事要躬行”的良好态度,通过T1的xid找到undo段的段头的事务表,去看下事情的真实情况,此时也有两种情况:

      2.1)已提交:那么这下子T2就心死了,回来后,把T1的相关事务信息清空,并且,把行头的锁也给削掉,这个行为产生redo。

      2.2)未提交:那么T2就确定了该行确实上头有人啊...动不得哈,回来后,通过T1的xid找到回滚块,将剩余未提交的行和在回滚块中的行,重构一个CR块,然后直接读取CR块。

 

 

行锁原理:

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

 

 

转自:http://blog.csdn.net/gybyylx/article/details/6893639

http://blog.csdn.net/linwaterbin/article/details/7819962

分享到:
评论

相关推荐

    oracle ITL事务槽

    总的来说,Oracle的ITL事务槽是其并发控制和事务管理的核心机制之一。它有效地跟踪和管理事务状态,确保数据一致性,并通过各种策略减少资源冲突,从而提升系统的整体性能和可靠性。了解和掌握ITL的工作原理对于优化...

    Oracle中关于事务槽(ITL).ppt

    主要针对oracle事务槽讲解。一本很经典的电子书。分享给大家

    Oracle中关于事务槽(ITL)

    Oracle数据库中的事务槽(ITL, Incident Transaction List)是数据块内部管理并发事务的重要机制。在Oracle中,每个数据块可以包含多个事务槽,用于跟踪并发事务对数据块的更改。当事务对数据块进行读写操作时,就会...

    【转】Oracle数据块深入分析总结

    在 Oracle 数据块中,ITL 事务槽是通过一个链表来实现的,每个事务槽都包含了事务的基本信息,如事务 ID、锁信息等。 三、dump 工具 dump 工具是 Oracle 数据库中用于分析数据块的重要工具。使用 dump 工具可以 ...

    BLOG_【故障处理】Oracle_lhr_队列等待之TX - allocate ITL entry案例.pdf

    1. **增加表空间的初始化参数**:可以通过调整表空间的初始化参数来增加每个块中的ITL槽数量。例如,可以考虑调整`_row_lock_wait_timeout`和`_row_lock_max_waits`等参数。 - `_row_lock_wait_timeout`:设置...

    BLOG_Oracle_lhr_Oracle死锁的分类及其模拟.pdf

    当多个事务并发操作时,由于ITL槽的限制或者ITL等待时间过长,可能导致死锁。 **ITL概念与结构** Intent Lock List(ITL)是Oracle中用于存储事务锁定信息的数组,位于数据块中。每个数据行都有一个与之关联的ITL...

    【故障处理】队列等待之TX 等待事件处理.docx

    当出现TX - allocate ITL entry等待时,通常是因为并发事务量过大,导致ITL槽不足。以下是一些解决策略: 1. **增加块大小**:如果可能,增大表空间的块大小可以增加每个块中可用的ITL条目数量,从而减少竞争。 2....

    浅谈Oracle常见错误处理

    XID代表事务标识符,用于在感兴趣事务列表(ITL)中标记事务。ITL则是数据块中记录事务状态的列表。Oracle的ROWID格式也做了说明,它由8个字节组成,分别代表相对文件号、数据对象号、块号和槽号。 文档中还提到了...

    理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf

    3. 数据库参数调整:如增加ITL槽的数量,以适应更多的并发事务。 4. 应用程序优化:避免在事务中进行不必要的查询,减少不必要的锁竞争。 总的来说,理解Oracle的锁机制是高效维护医院信息系统运行的关键。通过合理...

    ORACLE数据库并发访问控制机制及访问冲突的解决方法.pdf

    当用户进程找到被更新数据块的相应数据行时,在该行的头部设置一个行级锁,并记录当前事务使用的ITL槽号。当其他用户试图更新同一数据行时,他们必须等待当前事务完成后才能进行操作。锁定机制通过队列实现,并按照...

    oracle索引说明[参照].pdf

    通过分析Block Dump,我们可以查看索引块的详细状态,如对象ID、段类型、事务槽信息等。例如,`Itl`部分展示了与块相关的事务信息,包括槽ID、事务ID、撤销块地址、标记、锁信息和事务SCN。此外,我们还可以通过`...

    专题之Undo工作原理剖析

    从上面的信息可以看出,系统先分配了事务槽,然后再分配回滚块。 **查看回滚块相关信息:** - XID (Transaction Identifier): seg# + slot# + wrap (序列号),这里0x115等于前面提到的277。 - 该块当前的事务还...

    Oracle原厂数据库规范.ppt

    - `initrans`参数设定初始事务槽的数量。对于并发DML事务频繁的表,适当增加initrans值有助于减少ITL竞争,从而降低热点块和enqueue问题。但需要注意,initrans每个槽占用24Bytes空间,且不可超过10,同时initrans...

    oracle索引说明

    - **Itl**:表示相关的事务槽,包括槽ID、事务ID、撤销块地址、标记、锁信息以及事务SCN。 #### 通用的索引块头 ```plaintext header address 153168988 = 0x9212c5c kdxcolev 0 KDXCOLEV Flags=--- kdxcolok 1 ...

    ocp12c最新题库9月份最新更新ocp062.pdf

    ### Oracle Certified Professional (OCP) 12c 相关知识点解析 #### 用户账户管理 在 OCP 12c 的认证考试中,用户账户管理是重点考察领域之一。题目中涉及了关于用户账户管理的三个正确陈述: 1. **用户的当前...

Global site tag (gtag.js) - Google Analytics