求解答:事务导致了数据块变脏,但一直不提交,会不会影响dbwr将数据块写回磁盘?

[复制链接]
查看11 | 回复9 | 2014-8-6 06:00:13 | 显示全部楼层 |阅读模式
很多人说不会。但这样是不是可以得出一个结论:实例恢复的回滚过程,有可能产生redo日志。
我是这样理解的:
有个未提交的脏块写回磁盘变干净了,实例崩溃,重新启动数据库时进行实例恢复要回滚未提交事务,就是用undo里面的原来的块镜像来替换这个干净块吧,干净块岂不是又变脏了,变脏了是不是应该产生相应的redo日志?我这样理解对不对

回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
两个话题有关系么?实例恢复时首先重做,然后才回滚。
这个过程中数据块变脏是不会产生redo的...........
dbwr它有很多触发的条件,跟commit与否没有关系
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
kill 自动回滚了
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
machoyt 发表于 2014-11-16 09:10
两个话题有关系么?实例恢复时首先重做,然后才回滚。
这个过程中数据块变脏是不会产生redo的...........
...

也就是说在回滚的过程中会让没提交的数据块变脏,只是不产生redo日志?
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
commit跟dbwr、redo没有关系
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
数据在你改变后应该会把数据前映像写入undo,让后等待事务提交或者回滚。脏数据写入数据文件是由dbwr进程实现的,何时写入数据文件由dbwr进程决定。写入后不代表你的数据已经更新。select时会先去undo查询前映像的。
提交后会更新redo日志,删除undo前映像,数据完成更新。只有你的commit命令写入redo才算是事务完成。不是脏数据写入数据文件代表事务完成。
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
西南军阀 发表于 2014-11-17 10:50
也就是说在回滚的过程中会让没提交的数据块变脏,只是不产生redo日志?

rollback的过程是使用UNDO让没commit的数据块变回到原来没有修改的状态,而不是让其变脏吧,
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
sduzjw 发表于 2014-11-17 11:17
rollback的过程是使用UNDO让没commit的数据块变回到原来没有修改的状态,而不是让其变脏吧,

dbwr已将没commit的数据块写回了磁盘,没commit的数据块就是干净块。回滚又让没commit的数据块变回原来的状态,不就是变脏了么?
难道回滚变回原来状态的过程直接在磁盘中完成,不在内存中完成?如果是这样,也就不存在变脏和产生redo的问题了。这样理解是否正确?
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
西南军阀 发表于 2014-11-17 11:39
dbwr已将没commit的数据块写回了磁盘,没commit的数据块就是干净块。回滚又让没commit的数据块变回原来的 ...

DBWR回写到磁盘的数据块并不全是COMMIT了的块吧,
回复

使用道具 举报

千问 | 2014-8-6 06:00:13 | 显示全部楼层
sduzjw 发表于 2014-11-17 12:12
DBWR回写到磁盘的数据块并不全是COMMIT了的块吧,

不明白你回这么一句是什么意思。
我讨论回滚变脏的问题都是基于“DBWR回写到磁盘的数据块并不全是COMMIT了的块”这个事实啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行