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

来源:互联网 发布:php mysql事务处理 编辑:程序博客网 时间:2024/05/16 18:48
 
 
首先:
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,所以数据即使被写入了数据文件也没关系。
原创粉丝点击