日期:2014-05-16 浏览次数:20522 次
1)回滚段是磁盘上的一段空间
2)当一个事务开始的时候:
首先,把变化前的数据和变化后的数据写入redo log file
其次,把变化前的数据和相关的事务信息写入回滚段
最后,才在data_buffer_cache中修改数据
3)commit做两件事:
a)写日志
b)在回滚段中标记事务为inactive(小事务还会在buffer cache里面标志)
4)undo
a)delete操作:undo为整个数据行
b)update操作:undo仅为前镜像
c)insert操作:undo为rowid
当rollback时:
delete操作,则把回滚段中的数据重新写回数据块
update操作,把前镜像修改回去
insert操作,根据记录的rowid,将此删掉
5)查询的结果集是根据时间点来判定的。
6)回滚块和数据块一样,都在sga中,也都是database_buffer_cache的一份子
7)同一个事务不能跨越回滚段,即便是其他回滚段空闲,该大事务也只能使用被分配的回滚段即使该回滚段扩展。
接下来考究单个回滚段内的使用、扩展、回缩的问题
假定一个回滚段存在extent 1,2,3,4,5
8)一个回滚段至少包含2个区
9)每个回滚段有一个回滚段头,回滚段头是一个数据块,里面记录了事务表信息。
10)回滚段的区是循环使用的:事务从extent 1的第二个块开始使用,直到extent 5的末尾
回滚段的段头的事务表也是循环使用
区的使用从一个跨越到另一个的次数,可以查询如下:
sys@ORCL> select usn,wraps from v$rollstat;
USN WRAPS
---------- ----------
0 1
11 68
12 60
13 79
14 70
15 71
16 67
17 68
11)既然回滚段是循环使用的,那为什么会扩展呢?
假定这样一种情况,存在一个事务,呆在extent 3,一直没有提交,然后回滚段循环使用到了extent 2,当extent 2使用完毕的时候发现extent 3存在未提交的事务,这时,即使extent 4,5,1中的事务都已经提交,当前事务也不能越过extent 3而去使用后面的可使用的extent,那么只好扩展新的extent,假定为extent 2-1.因为回滚段之间的区是链状串起来的,但节点2-1的下一个extent依然是extent 3,假如2-1使用完毕发现extent 3仍然存在未提交的事务,则继续扩展。回滚段在扩展后,是需要回收的。Smon进程每12h作为一个周期会对所有回滚段进行回收。shrinks表示回收的次数
sys@ORCL> select usn,optsize,shrinks from v$rollstat;
USN OPTSIZE SHRINKS
---------- ---------- ----------
0 0
1 1
2 0
3 0
4 1
5 0
6