一、数据更新
1.申请获得undo段中的事务表的操作权,即请求事务槽A
2.由于事务槽指向一个undo段中的空间,所以找到事务槽就找到了该数据内容
3.申请获得datafile中的block上的ITL槽,指向事务槽A
4.复制旧数据到undo的事务槽A中
5.由于ITL槽存放着a.事务号 b.scn c.undo中事务槽,所以找到ITL槽就找到了事务信息undo中的信息
6.找到datafile中的block,在其表头中a.标记锁定b.存放ITL槽号
7.其他事务不能对该block加TX锁
8.commit后,修改block的值;
9.执行块清除(修改undo事务槽A为unactive(以方便重用);清除ITL槽中清除scn,事务号,释放TX锁),完成更新
二、数据查找
事务AA(select多表操作较慢)在前,事务BB(update操作)在后;事务AA查询数据块54#的数据,先找其数据块头部中的ITL槽号,根据槽号找到槽信息后,发现scn比自身scn要新(由于该数据块已被事物BBcommit后更新),由于oracle的一致性读,则事务AA需要在ITL槽信息中去读undo中事务表中的数据
三、申请ITL的条件
1.commit
用户提交后,oracle先找到datafile的block,在申请ITL槽,若果ITL槽被使用光了(并发量大),在block中的free空间中划分一块区域作为ITL槽,当free空间不足时,造成ITL等待;获得ITL槽后执行数据更新
2.块清除的情况
当数据更新量大时,超过buffer cache总量的10%(但还不是全部更新的数据),这时即使不提交,前面的这部分数据也会被DBWn写入datafile的block中去,过程同1;
区别在此时为未提交的状态,不执行块清除,即使该事务最后提交了,前期的数据也不再执行块清除,但会将他们的undo段中的事务槽标记为unactive状态(因为块清除需要再次掉入内存,在写回磁盘,影响效率)
为此,oracle采用了延迟块清除
四、延迟块清除
oracle再次访问该datafile的block时,找到ITL槽中的undo记录,如果事务槽为active状态,则读取;为unactive状态则给予清除ITL信息;
延时块清除会产生物理读,和redo信息
五、由于ITL中的指向undo事务表的信息未被清除,所以可以通过闪回方式,恢复修改前的数据(前提undo信息未被覆盖)