Oracle读取或修改数据块的流程:
一.(读操作)非唯一索引方式,非索引根块和分支块
- 对要访问的块地址做HASH
HASH(FILE#,BLOCK#) = hash_value(HV)
根据HV找到对应的HASH bucket
以独占方式申请管辖此bucket的CBC latch
搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH
修改BH中的buffer pin锁为S(share)模式(之前为0,无锁)
释放CBC latch.
根据BH中的BA指针找到buffer
读取buffer中的数据到PGA中.
以独占方式申请管辖此bucket的CBC latch
10.修改BH中的buffer pin锁为0(无锁)模式
11.释放CBC latch
二.(读操作)唯一索引方式所有块,非唯一索引根块和分支块
- 对要访问的块地址做HASH
HASH(FILE#,BLOCK#) = hash_value(HV)
根据HV找到对应的HASH bucket
以共享方式申请管辖此bucket的CBC latch
搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH
根据BH中的BA指针找到buffer
读取buffer中的数据到PGA中
释放CBC latch
三.(写操作)
- 对要访问的块地址做HASH
HASH(FILE#,BLOCK#) = hash_value(HV)
根据HV找到对应的HASH bucket
以独占方式申请管辖此bucket的CBC latch
搜索bucket中的HASH chain链表,比对chain上的buffer_header(BH),找到目标BH
. 5. 修改BH中的buffer pin锁为X(exclusive)模式(之前为0,无锁)
释放CBC latch
根据BH中的BA指针找到buffer
产生redo数据
修改buffer中的数据.
以独占方式申请管辖此bucket的CBC latch.
10.修改BH中的buffer pin锁为0模式
11.释放CBC latch.