先到者为君,后到者为臣!作为技术屌丝的你,肯定有过很多感慨,不要总是步人后尘,请加入我们的Hadoop先行者行列,让我们一起走在大数据时代的前列。

尖峰在线培训学员作品

每位在尖峰在线培训的同学都可以获得基础知识和实战操作的双重提高

模拟Oracle中的ACID异常现象—COMMIT也会丢数据

 

Jonathan LewisOracle Core这本书中提到了一种ACID异常的现象,在这种情况下,事务已经提交,但是redo log buffer还没有写到磁盘。

如果断电,已提交的事务会丢失数据。

实验之前,我们首先来复习一下commit这个操作。

通常情况下,commit是一个非常快的操作,commit的主要操作是更新事务表槽的SCN。这个操作本身也会产生redo,一般来说,这是一个很快的操作。具体细节如下:

1.得到一个SCN值,准备更新事务表的事务表槽。并且在redo log buffer中为这次更新操作创建一条redo 记录

2.将生成的redo记录复制到日志缓冲区。

3.undo事务表槽,应用这条redo。事务表中的槽位的SCN等信息被更新。

4.将这条commit记录产生的redo log buffer刷新到磁盘上的在线日志文件。

在第3步和第4步中间,其他的会话能看到事务已经改变,尽管redo还没有写到磁盘,如果数据库实例在第3步和第4步中间崩溃,那么有可能这个已经提交的事务没有被恢复。演示如下:

1.会话1:使用mdb或者oradebuglgwr挂起。

2.会话2:修改一条数据然后提交--会话会挂起。

3.会话3:查询数据,并注意到修改后的数据是可见的。

4.会话3shutdown abort,数据库重启后,第2步产生的更改丢失。

 

完整文档请点击下载

2014-06-30 22:01:25
Copyright © JianFengEdu.com 2013. All Rights Reserved . 尖峰在线培训 版权所有 . 浙ICP备14005612号-1  
  • QQ咨询

  • 点击这里给我发消息 陈老师
  • 点击这里给我发消息 郭老师
  • DBA基础学习群

    尖峰OracleDBA基础学习群
  • 电话咨询

  • 13735456161