为什么可以把未提交的数据写入数据文件?——通过DML操作举例解析
原创
©著作权归作者所有:来自51CTO博客作者gujunpu的原创作品,请联系作者获取转载授权,否则将追究法律责任
首先:
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,所以数据即使被写入了数据文件也没关系。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
解析管道数据文件IDF
IDF和PCF是包含管道走向数据的文本文件,一般是由工厂软件系统从管道
PipeCAD 数据 自动生成 二维码 -
Python 数据文件操作——写出数据Python
















