来源:Oracle认证 发布时间:2012-11-12 Oracle认证视频 评论
二、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的独一致性。
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。