undo块的重用问题“新化块”与“一个undo块中出现两个事务的undo记录”

[复制链接]
查看11 | 回复3 | 2017-3-27 08:04:23 | 显示全部楼层 |阅读模式
以下两句都是路易斯《Oracle核心技术》里的原话~~
(1)Oracle打算重用一个undo块时,它并不关心之前的内容,因此在重用之前不会费力的从磁盘读取该块;仅仅是在缓存区内存中分配一个buffer并格式化成一个新的空块,该过程称为新化块。
(2)单个undo块也可以包含多个事务中的undo记录。
这两句话是不是矛盾了?
如果按照上面的“新化块”的方式重用undo块的话,在该undo块对应的buffer写到磁盘的时候岂不是要把undo块中之前所有的undo记录覆盖掉,这样的话怎么会存在一个undo块中出现两个事务的undo记录的情况?
求大神指点!!!

回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
gjho3zhou 发表于 2015-9-14 10:23
沙发!

这个问题已经解决了。具体如下,希望对后来的朋友有所帮助。
(1)如果通过新化块的方式重用一个undo块,那么是会把之前的内容全部覆盖掉的,所以通过这种方式得到的undo块中不会包含两个事务的undo记录。
(2)之所以会出现一个undo块中包含两个事务的undo记录,是因为如果一个事务使用了一个undo块,但是在事务提交之后,这个undo块中还有大量的空闲空间的话,仍然会被放到自由池中,下一个事务在用这个undo块的时候就不能通过新化块的方式了,是需要把这个块读取到内存,然后接着使用剩余的空闲空间。这样一个undo块中就包含了多个事务的undo记录。
不过你来这抢沙发是什么意思?来灌水么?


回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
Thanks for the research and posting the answer. Regarding the second point, Steve Adams said the same in his 16 March 2000 Q&A:
http://www.ixora.com.au/q+a/undo.htm
"Multiple transactions can share an undo block, but only in series, not concurrently."
回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
Yong Huang 发表于 2015-9-14 23:27
Thanks for the research and posting the answer. Regarding the second point, Steve Adams said the sam ...

Thanks!
I thought *newing* is the only way that Oracle uses undo blocks forgetting that Oracle can also pick free undo blocks from free pool if there're any in it~~
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行