0
点赞
收藏
分享

微信扫一扫

DB中未Commit的数据会不会写入磁盘

律楷粑粑 2022-03-12 阅读 117

未commit的数据会不会写入磁盘,这个比较模糊。磁盘的意思是写入日志文件还是写入数据文件(数据load上来的地方)?

事务的commit这个动作,Oracle首先不是将数据从数据库缓冲区中刷到磁盘里面,而是先将修改数据的这些动作写成redo也就是重做日志了。

至于Oracle何时会将数据从数据缓冲区中刷到磁盘上,是由DBWR进程来进行的,而DBWR又是由CKPT检查点进程来决定何时工作的。

这里可以大概说一下,数据缓冲区中有两个列表,一个是写入列表,一个是最近最少使用列表。在数据缓冲区里面的数据写入到磁盘的这个过程,其实就是数据从写入列表中写入到磁盘的过程。

所以说,事务未提交,数据是不会写到磁盘(原数据地方)上面去的。但是commit之后,是否有写到磁盘上,就不一定了,需要等待dbwr写,就是迟早会写。


另外,如果一个事务调取了这部分的数据进行了修改,但是没有commit,另外一个事务也正在调取这部分数据,那么由于前一个事务的修改还没有提交,所以新事务看到的数据还是未修改之前的。其实这个就是所谓的“读一致性”,这是Oracle数据库重要的特征之一。Oracle数据库通过undo来实现“读一致性”的功能。
“快照太旧”就是有关undo的经典错误,Oracle为了保证“读一致性”,宁愿报错读不到数据也不会读出错误的数据给用户。

举报

相关推荐

0 条评论