9

我不是 DBA,我很难理解 Oracle 的事务管理流程。

根据我通过阅读互联网上一些看起来可靠的页面(最值得注意的是这个AskTom 注释——但不要理会评论)所了解的情况,提交事务时,尚未在实际数据块上报告新数据,但保持记录在回滚段上。当有人对数据发出 SELECT,或者当 UNDO_RETENTION 秒过去时——无论这两个事件中的哪一个先发生——,然后(并且仅在那时)将新数据写入数据块。

但是我们公司的某个人,据说是知道的,最近告诉我相反:据他说,当一个事务提交时,新数据立即写入数据块,回滚段/撤消表空间保留旧数据以备不时之需。 UNDO_RETENTION 秒的持续时间。在此期间,这些旧数据保持可用,供交易前在 SCN 上启动的查询访问。

那么,Oracle 内部到底发生了什么,您能否提供参考来支持您的回复?

我们使用的是 Oracle 9.2.0.8。

提前致谢。

4

3 回答 3

14

这里有很多内容!贵公司的人基本上是对的,只是更改会在进行时写入内存中的数据块,甚至在提交之前;并且它们完全独立于您提交的时间写入磁盘(可能之前,可能之后,从不作为提交操作的一部分)。

1) UNDO_RETENTION 与您的更改何时写入数据块无关,无论是在内存中还是在磁盘上。UNDO_RETENTION 控制在您提交更改后撤消更改所需的数据保留多长时间。目的是在您提交之前开始的其他查询或可序列化事务可能仍需要该数据。参考:http: //download.oracle.com/docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477

2)当你进行更新时,内存中的数据块会被修改。它们可能会也可能不会写入磁盘(我相信甚至在您提交之前);这是由后台进程完成的。此外,重做信息被写入重做日志缓冲区。撤消生成并存储在撤消段中。

3) 当您提交时,Oracle 确保您的重做信息写入磁盘,并将撤消数据标记为已提交。但它不会将内存中更改的数据块写入磁盘,也不会返回并将每个块标记为已提交。这是为了使提交尽可能快。参考:http: //download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628

4) The data blocks in memory will be marked as committed either when they are written out to disk by the background process, or the next time they are used (by a SELECT or any other operation). That's what the AskTom note is discussing. This is not about whether your changes to data are written to the block; it is about whether they are marked as committed in the block itself.

于 2008-10-10T12:46:28.313 回答
0

我的理解是(基本上)后者,这个链接有详细信息。

数据块不必写入,只需在缓冲区中更新,它们可能会或可能不会写入磁盘。在提交可以继续之前,重做必须写入磁盘。

于 2008-10-10T10:23:06.850 回答
0

我还根据
链接投票支持第二个版本(即 Oracle 10.2,但我认为它仍然适用于 9.2)。

它说:“提交事务后,回滚或事务恢复目的不再需要撤消数据。但是,为了一致的读取目的,长时间运行的查询可能需要这些旧的撤消信息来生成数据块的旧图像。”

“启用自动撤消管理后,当前的撤消保留期始终存在,这是 Oracle 数据库在覆盖旧撤消信息之前尝试保留它的最短时间。”

于 2008-10-10T12:16:35.937 回答