A B 两用户,A 在10点更改X表的10到20 但一直未提交,B在10:30 要读取X表的A更改的那条记录的值,这时恰好B要读取的块在内存里面(由于A更改需要把数据读取到内存)。这时候有几种情况,假如此时ORACLE允许B读取到A更改后但未提交的数据,这时就发生了脏读。另外就是不让B读取到A的更改,读取到A更改以前的数据,这时就发生了一致性读。一致性读会从现在的脏块和undo记录 构造一个CR块 构造出来的CR块与磁盘上的块是一致的 我的理解是这样的 当然情况不只上面这一种,很多种情况 建议你看看 oracle隔离级别 相关的文章 应该会有用
成都创新互联公司是一家专注于网站设计制作、成都网站建设与策划设计,鸡西梨树网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:鸡西梨树等地区。鸡西梨树做网站价格咨询:18982081108
ORACLE的表索引失效,需要重建, 如何查看表里是否有脏数据?
脏数据在 内存里,只要是存在物理存储设备上的数据都是干净的。 ]
索引失效并不会影响表中的数据的。
脏数据就是已经写入到内存里,但是还没有写入到硬盘上的数据。一般当事物没有提交的时候会产生,当事物提交以后,脏数据就会被写进硬盘的数据块,这时他就不叫脏数据了。
dbwr 进程扫描 db buffer cache, 将其中被修改过的数据块(即脏数据)写出至磁盘.
脏缓冲区(dirty buffers),有的书将它翻译成脏缓存块。脏数据是相对于原数据而言的,是指被修改过的,与原数据不一样的数据。
在oracle有SGA中,有个数据高速缓冲区(database buffer cache),由许多大小相等的缓存块组成。这些块根据使用情况不同,可分为脏缓冲块、空闲缓存块和命中缓存块三类:
1. 脏缓存块(dirty buffers):它保存的是已经被修改过的数据。当一条SQL语句对某个缓存块中的数据进行修改后,这个缓存块就被标记为脏缓存块。
2. 空闲缓存块(free buffers):不包含任何数据,它们等待后台进程或服务器进程向其中写入数据。当oracle从数据文件中读取数据时,将会寻找空闲缓存块,以便将数据写入其中。
3. 命中缓存块(pinned buffers):是那些正被使用,或者被显式地声明为保留的缓存块。这些缓存块始终保留在数据高速缓冲区中,不会被换出。