为什么可以把未提交的数据写入数据文件?――通过DML操作举例解析

首先:
1.transaction是否commit跟DBWn何时把脏块儿写入datafile没有任何直接关系;
2.无论DBWn何时写入,LGWR都会先于它记录下来
 许多的原因都会促使 dbwn进程写入数据,如检查点,数据缓冲区空间不够等等。而且是不管数据是否提交。
   写入已提交的数据就不说了,下面有两种情况:
1.数据 已经提交,但是还没有写入数据文件,不过 commit后会写redo buffer,是有记录的;
2.数据没有提交,但是已经被写入数据文件,不过DBWn写入之前会 触发LGWR写redo buffer,也是有记录的

   这里的有记录,其实就是记录了你是否提交,这就很好理解“为什么可以把未提交的数据写入数据文件”。
下面举个例子可以加深理解:
事务进行时的DML操作修改data buffer cache一个数据块,新值换旧值。这里还需要另一个 某undo 中的可用数据块。
会经历下面步骤(没写出跟锁有关的步骤):
1.首先生成重做,即在 redo buffer 中写下两个变更向量,这两个变更向量分别用于两个数据块儿的变更;
2.存有新值的变更向量让data buffer cache中的数据块变更为新值, 存有旧值的变更向量让 undo 中的数据块变更为旧值
3. 同时在redo buffer和undo中对该事务都有一个是否提交的标记。两者的默认状态都是active的,即没有提交时刻处于激活状态
4.commit成功后,redo buffer信息全部写入redo file,同时修改两者中的事务提交标识为inactive。未commit的话,事务依旧是active,所以数据即使被写入了数据文件也没关系。


你可能感兴趣的:(oracle,DML,未提交的数据写入数据文件)