关于oracle更新数据的内在机制问题?

[复制链接]
查看11 | 回复4 | 2006-2-9 23:06:32 | 显示全部楼层 |阅读模式
我们都知道,在做DML操作时,oracle先把数据更新记录在缓存中,然后ckpt记录检查点并通知dbwr往磁盘些数据。
我想问的问题是加入我跟新的数据还没有写入磁盘,还在内存中时(脏数据),我又对这条数据进行修改操作,或者做查询动作,这时oracle是怎么处理的?有一个怎样的处理过程?
怎么在并行处理数据时,保证数据的一致性?

小弟对这块了解不深,请各位指教,共同进步!
回复

使用道具 举报

千问 | 2006-2-9 23:06:32 | 显示全部楼层
ORACLE 有一个undo tablespace存储了 撤消段.
撤消段保存了了数据的旧值.你从数据库读出记录,然后又更改了. ,如果没有commit的话,
别人如果查询的话,他将从undo里的撤消数据里读取记录.
回复

使用道具 举报

千问 | 2006-2-9 23:06:32 | 显示全部楼层
"别人如果查询的话,他将从undo里的撤消数据里读取记录."
应该是根据回滚的信息重构当时的数据,而不是从UNDO中读取记录,我认为
回复

使用道具 举报

千问 | 2006-2-9 23:06:32 | 显示全部楼层
假如commit了,就一定能保证数据的一致性吗?
有可能数据还没有写进磁盘,而查询时读取旧的数据
也就是说并没有执行dbwr
回复

使用道具 举报

千问 | 2006-2-9 23:06:32 | 显示全部楼层
看看consistent read的概念吧..
如果查询scn小于block的scn查询就正常进行, 如果大于, 就读取undo block做恢复, 一直到找到commit scn > query scn的block为止..
如果无法找到, 就报ora-01555错误..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行