模拟Oracle中的ACID异常现象—COMMIT也会丢数据
在Jonathan Lewis的Oracle 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或者oradebug将lgwr挂起。
2.会话2:修改一条数据然后提交--会话会挂起。
3.会话3:查询数据,并注意到修改后的数据是可见的。
4.会话3:shutdown abort,数据库重启后,第2步产生的更改丢失。
完整文档请点击:下载
2014-06-30 22:01:25