【oracle】multi-versioning and flashback

多版本 多版本是Oracle并发控制机制的基础,Oracle采用多版本、读一致的并发模型。 当我们要检索一张员工表,并要获得所有工资的总和时,通常使用以下sql select sum(salary) from emp; 但当数据库查询到第100条时,另外的用户将第101条员工的工资提高了500,那么这时我们的查询会出现什么结果呢? 是提高了500工资之后的数据还是提高工资之前的数据呢? 实际上当oracle中的数据被改变时(如update,insert等),oracle会把改变之前的数据放在undo段的数据区内, 这个数据区也称为回滚段。 当查询语句发现要查询的数据已经被改变时,会从undo段内取得改变之前的数据,所以得到的结果就是提高工资之前的统计数据。 所谓“改变之前”的时间点就是查询开始的时间点或游标打开的时间点。 闪回(flashback) 闪回需要使用到系统改变号(system change number,简写为scn),其实scn就是一个多版本的时间点,每次commit时 scn就会向上递增。 dbms_flashback.get_system_change_number便是scn了。 可使用绑定变量取得scn: exec :scn := dbms_flashback.get_system_change_number 输出scn: print scn SCN ---------- 986408 通过scn我们就能查询到某个时间点下的数据。例如: select * from emp as of scn :scn; 这样就可以查询“历史记录”了。 在oracle 10g以后,提供了flashback命令,它使用了多版本技术,可以把对象回复到以前某个时间点的状态。 如: flashback table emp to scn :scn; 如果出现“ORA-08189: cannot flashback the table because row movement is not enabled using the FLASHBACK command” 的错误,这需要执行以下命令: alter table emp enable row movement; 这个命令的作用是,允许Oracle修改分配给行的rowid。在Oracle中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。 闪回表处理会对EMP完成DELETE,并且重新插入行,这样就会为这些行分配一个新的rowid。要支持闪回就必须允许Oracle执行这个操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值