当前位置: 代码迷 >> Oracle管理 >> 新增、删除操作急需用到回滚表空间么
  详细解决方案

新增、删除操作急需用到回滚表空间么

热度:226   发布时间:2016-04-24 04:07:53.0
新增、删除操作需要用到回滚表空间么?
如题,求大神解答!!
------解决思路----------------------
delete 必然是用的,被删除的全部数据都会先放入回滚段,rollback时再插回去。
insert 也会用,但是不是数据,而是会把insert行的rowid记进去,一旦需要rollback,把相应的行删除即可。
------解决思路----------------------
The undo segments contain the old values of data that have been changed by uncommitted or recently committed transactions.

concepts里并没有就insert, update, delete 对undo进行分析,但是从undo的本质和测试中可以得到一些线索。
insert时在undo中只记录rowid; update在undo中保存被修改的记录的对应字段及rowid; delete会产生被删除的记录的所有字段值及rowid
------解决思路----------------------
引用:
Quote: 引用:

delete 必然是用的,被删除的全部数据都会先放入回滚段,rollback时再插回去。
insert 也会用,但是不是数据,而是会把insert行的rowid记进去,一旦需要rollback,把相应的行删除即可。


在做修改操作时,是把整个表所有字段都放到回滚表空间去,还是只把被修改的那几个字段放入回滚表空间呢??

把修改前的相关字段值放到UNDO里
------解决思路----------------------
引用:
Quote: 引用:

The undo segments contain the old values of data that have been changed by uncommitted or recently committed transactions.

concepts里并没有就insert, update, delete 对undo进行分析,但是从undo的本质和测试中可以得到一些线索。
insert时在undo中只记录rowid; update在undo中保存被修改的记录的对应字段及rowid; delete会产生被删除的记录的所有字段值及rowid


那么问题来了,当查询表的全部字段,并发生一致读的情况下,数据库是在自己表空间读一部分字段,又在UNDO表空间读取另外一部分字段吗?


是这样子的,没错。
------解决思路----------------------
insert操作很简单,只要保存记录插入到数据块及数据块内的槽号,回滚时只要根据数据块号及槽号做删除就可以了。

update操作需要保存记录位置,还需要保存变更的字段原内容,回滚时采用原值即可。

delete操作麻烦一些,不仅要保存记录位置,还需要将原有记录的内容全部保存下来,回滚时才能组成新的数据插入进去。
具体的我们共同学习吧,我也不太了解。
http://www.cnblogs.com/solan/archive/2009/02/06/1385323.html
  相关解决方案