Oracle – 事务,回滚段和undo_retention参数如何工作?

前端之家收集整理的这篇文章主要介绍了Oracle – 事务,回滚段和undo_retention参数如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不是DBA,我在理解Oracle的事务管理流程时遇到了一些困难.

通过阅读互联网上一些看起来很可靠的页面(最值得注意的是这个AskTom note – 但不打扰评论)我理解了这一点,当提交一个事务时,新数据还没有在实际数据块上报告,但保持登录回滚段.当有人对数据发出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笔记所讨论的内容.这不是关于您对数据的更改是否写入块;它是关于它们是否在块本身中标记为已提交.

猜你在找的Oracle相关文章