
加载中…
个人资料
- 博客访问:
- 关注人气:
- 获赠金笔:0支
- 赠出金笔:0支
- 荣誉徽章:
oracle的回滚和撤销机制
(2011-11-04 10:10:49)
为了保证数据库中多个用户间的读一致性和能够回退事务。
一、在一个简单的更新语句中,对于回滚段的操作存在多处,在事务开始时,首
先需要在回滚表空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的
修改才能进行,oracle必须以此来保证事务是可以回滚的。如果用户提交了事务
,oracle会在日志文件记录提交,并且写出日志,同时会在回滚段中把事务标记
为已提交;如果用户回滚事务,则oracle需要从回滚段中把前镜像数据读取出来
修改数据缓冲区,完成回滚,这个过程本身也要产生redo,所以回退这个操作是
很昂贵的。
二、回滚段存储的内容
1、对于insert 操作,回滚段只需要记录插入记录的rowid,如果回退,只
需要将该记录根据rowid删除即可。
2、对于update操作:回滚段只需要记录被更新字段的旧值即可,回退时通
过旧值覆盖新值即可完成回退。
3、对于delete操作,oracle则必须记录正行的数据,在回退时,oracle通
过一个反向操作恢复删除的数据。
三、并发控制和一致性读
1、一方面oracle通过锁定机制实现数据库的并发控制;一方面通过多版本
模型来进行并发数据访问。通过多版本架构,oracle实现了读取和写入的分离,
使得写入不阻塞读取,读取不阻塞修改。这是oracle数据库区别于其他数据库的
一个重要特征。oracle一方面不允许其他用户读取未提交数据,一方面要保证用
户读取数据要来自同一时间点。
http://s8/middle/8f5296d5hb0e21897e627&690
假设员工scott的薪水为3000那么:
1)在t1时间,在session1查询可以得到这个结果
2)在t2时间session2进行更新,将scott的薪水增加3000,并为提交
3)在t3时间session1再次查询,注意此时,oracle不会允许其他用户看到未提交数据,所以此时,oracle需要通过回滚段记录的前镜像进行一致读,将3000恢复出来供给用户,这是一致性读的作用。
4)在t4时间,session2提交更改,此时数据修改被永久化;
5)在t5时间,其他用户再次查询,将会看到变化后的数据,也就是4000.
oracle内部使用scn作为时钟,在这里查询结果集就是根据scn来进行判断的,每个数据块头部都会记录一个提交scn,当数据更改提交后,提交scn同时被修改,这个scn在查询时可以用来进行一致性读判断。
四、在自动undo管理表空间,oracle随之引入了几个新的初始化参数
undo_management:用来定义数据块使用的回滚段是否使用自动管理模式。该参数有两个选项,auto表示自动管理,manual表示手工管理。
undo_tablespace:用来定义在自动管理模式下,当前实例使用哪个undo表空间。
undo_retention:表示在自动管理模式下,当回滚段变得非激活之后,回滚段中的数据在被覆盖前保留的时间,该参数单位是秒。
五、回滚机制的深入研究
1、获取事务信息:
v$transaction动态视图
xidusn:回滚段号
xidslot:事务槽
xidsqn:事务的序列号
ubafil:undo block address filenum
ubablk:UBA block number
ubarec:UBA record number
v$rollstat动态视图
usn:回滚段标识
rssize:回滚段默认大小
xacts:活动事务数
writes:回滚段写入数
shrinks:回滚段收缩次数
extends:回滚段扩展次数
gets:获取回滚段头次数
waits:回滚段头等待次数
2、转储undo段
在undo段头的转储文件中,dba指向的就是包含这个事务的前镜像的数据块地址。前十位代表文件号,后22位代表block号。转储文件中的irb:指的是回滚段中记录的最近未提交变更开始之处,如果回滚,这是起始的搜索点。rci:该参数代表的是undo
chain(同一事务中的多次修改,根据chain连接关联)的下一个偏移量。在x$BH中class字段中4表示的是段头,1表示的是数据块,state为3的就是一致读构造的前镜像。
select b.segment_name
,a.file#,a.dbarfil,a.dbablk,a.class,a.state
from x$bh a,dba_extents b
where b.relative_fno=a.dbarfil
and b.block_id<=a.dbablk
and b.block_id+b.blocks>a.dbablk
and b.owner='SCOTT'
and b.segment_name='EMP'
3、转储数据块信息
ITL事务槽指interested transaction
list,事务必须获得一个ITL事务槽才能够进行数据修改ITL内容包括:
xid:事务的id
uba:undo块的地址
lck:lock status
xid=undo.segment.number+transaction.table.slot.number+wrap
事务的内部流程