我不是DBA,而且我很难理解Oracle的事务管理流程。
根据我的理解,通过阅读互联网上一些看起来很可靠的页面(最值得注意的是这个AskTom note - 但不要轻视评论),当提交一个事务时,新数据是 not 尚未报告实际数据块,但仍保留在回滚段上。当有人在数据上发出SELECT时,或者当UNDO_RETENTION秒已经过去时 - 无论这两个事件首先发生 - 那么新数据就会(然后才会)写在数据块上。
但据我所知,我们公司的某个人最近告诉我相反的情况:根据他的说法,当提交一个交易时,新数据 立即写在数据块上,并且rollback segment / undo tablespace将旧数据保留UNDO_RETENTION秒的持续时间。在此期间,此旧数据仍可用于在事务之前在SCN上启动的查询进行访问。
那么,Oracle内部真正发生了什么,你能提供备份回复的参考吗?
我们正在使用Oracle 9.2.0.8。
提前致谢。
答案 0 :(得分:13)
这里有很多内容!公司中的人员基本上是正确的,除非更改在提交之前写入内存中的数据块 ,甚至在提交之前;并且它们完全独立于提交时写入磁盘(可能在之前,之后,从未作为提交操作的一部分)。
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)内存中的数据块在被后台进程写入磁盘时或下次使用时(通过SELECT或任何其他操作)将被标记为已提交。这就是AskTom笔记所讨论的内容。这不是关于您对数据的更改是否写入块;它是关于它们是否在块本身中被标记为已提交。
答案 1 :(得分:0)
我的理解是(基本上)后者,This link有详细信息。
不必编写数据块,只需在缓冲区中更新,它们可能会也可能不会写入磁盘。必须先将重做写入磁盘,然后才能继续提交。
答案 2 :(得分:0)
我也投票支持基于
的第二个版本
这个link(这是Oracle 10.2,但我认为它仍然适用于9.2)。
它说: “提交事务后,不再需要撤消数据进行回滚或事务恢复。但是,为了保持一致的读取,长时间运行的查询可能需要这些旧的撤消信息来生成数据块的旧图像。”
和
“启用自动撤消管理时,始终存在当前的撤消保留期限,这是Oracle数据库在覆盖之前尝试保留旧撤消信息的最短时间。”