我不是DBA,而且我在理解Oracle的事务管理流程时遇到了一些困难.
通过阅读互联网上一些看起来很可靠的页面(最值得注意的是这个AskTom注释 - 但不要轻视这些注释)我理解了这一点,当提交一个事务时,新数据还没有在实际数据块上报告,但保持登录回滚段.当有人对数据发出SELECT时,或者当UNDO_RETENTION秒已经过去时 - 无论这两个事件中的哪一个先发生 - 那么新数据就会(然后才会)写在数据块上.
但据我所知,我们公司的某个人最近告诉我相反的情况:根据他的说法,当提交事务时,新数据会立即写入数据块,并且回滚段/撤消表空间保留旧数据UNDO_RETENTION秒的持续时间.在此期间,此旧数据可用于在事务之前在SCN上启动的查询进行访问.
那么,Oracle内部究竟发生了什么,您是否可以提供备份回复的参考?
我们使用的是Oracle 9.2.0.8.
提前致谢.
这里有很多东西!公司中的人员基本上是正确的,除非在提交之前将更改写入内存中的数据块,甚至在提交之前; 并且它们完全独立于您提交时(可能在之前,可能之后,从不作为提交操作的一部分)写入磁盘.
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笔记所讨论的内容.这不是关于您对数据的更改是否写入块; 它是关于它们是否在块本身中标记为已提交.