如果一个事务还没提交,那么它中间产生的数据变化会不会在未提交之前写入磁盘
1、如果一个事务还没提交,那么它中间产生的数据变化会不会在未提交之前写入磁盘呢?
回答:
会,写入不写入磁盘和提交没提交没有关系
commit 不一定会写磁盘哦,要等到dwr进程的时候才会写入磁盘吧,但commit一定会写人redo
一个事务 commit 并不是把数据写到数据文件中,而是写到联机 重做日志文件中
2、Oracle 中存在这样的情况吗?某事务没有提交,它的改动已经写回到数据文件,给解释一下怎样出现的这种情况?谢谢!
回答:
其实你这个问题本身就有问题
因为数据提不提交和数据有没有被写到数据文件没有关系。数据提交了,有可能没有被写到数据文件!数据没有提交,有可能写到数据文件!
这个就没有什么好解释的。好好看看lgwr和DBWn的作用和触发条件
应该说楼主你说的这种情况,是ORACLE的常态,有几个条件会触发写入数据文件,比如缓存使用达到了阀值(100M),或者达到一定比例,比如进行了CHECKPOINT
比如说你一个大事务未提交,这时候因为BUFFER已经超过100M,脏数据已经写入到数据文件种,这时候数据库发生了DOWN机,
在重启时,数据库首先要验证数据文件与控制文件的的SCN号,发现这个表空间有不应该提交的数据,然后就是用回滚段进行回滚。
有时候需要REDO先产生UNDO。然后数据文件达到一致,数据库OPEN.
3、DBWR 在什么情况下会写脏数据到数据文件:
1.当脏缓冲区的数量超过阈值。
2.设定的时间间隔达到。
3.检查点发生时
4.tablespace 发生 offline 或恢复normal
5.对某个表联机设备时
6.找不到free buffer时
7. drop 或truncate 表时
8.把表设置为read-only时
这样看 好像,脏数据随时都有可能被写入datafile中,不管是不是提交了。
4、其中checkpoint 发生又有多的情况
(1) 日志切换 (自动或人为)
(2)Timeout
(3)alter system checkpoint
(4)alter tablespace begin backup or end backup
(5)datafile offline
如果 checkpoint 发生的 所有脏数据都flush 到 datafile中?此checkpoint 之前的所有redo file 对恢复不再有用。
checkpoint
DBWR
LGWR
三者有自己的运行机制,又有联系。在看看之间的关系
更新后没有提交(COMMIT)的数据一般存放在了内存SGA数据缓冲区的脏列表中。有些更新过的数据由后台写数据进程DBWn被写入数据文件中,但加上未提交标志。等事务被COMMIT时,把未提交标志改为已提交标志。数据库恢复操作中回滚就是因为没有提交数据被写入数据文件引起的。
参考链接
http://www.itpub.net/thread-1505747-1-1.html