全部博文(389)
分类: Oracle
2011-03-27 19:39:01
Enqueue简述
Enqueue也被称为LOCK,用来保护对共享资源访问的一种数据结构.
在ORACLE中,每种对像都称为resource.如TABLE,ROWS,.每个resource都由一个称为resource identifier来唯一的标识. resource identifier的格式为<(resource type),id1,id2>, resource type由两到三个字符组成的资源代码,如TX,详见(oracle reference),ID1,ID2由每种资源自定义.这样就每种资源都有一个resource identifier了.
在ORACLE中,根据HASH值不同,每个resource都链接到一个LINK LIST上.多条LIST组成RESOURCR ARRAY,每个LINK LIST的长度由ENQUEUE_RESOURCE参数来决定,总的LIST数量由_ENQUEUE_HASE参数来决定.ENQUEUE CHAIN LATCH用来保护对一个LINK LIST的访问,由_ENQUEUE_HASH_CHAIN_LATCHES来决定ENQUEUE CHAIN LATCH的多少.
当一个SESSION试图以LOCK MODE访问一个RESOURCE时,先进行HASH与ENQUEUE HASH TABLE比较,看是命中在哪个HASE BUCKET,然后申请ENQUEUE HASH CHAIN LATCH,再进行查找,如果RESOURCE不在LIST上,则把RESOURCE放到这个LINK LIST上,同时在更新RESOURCE的OWNER队列,
如果RESOURCE已在LIST上,则检查OWNER的LOCK MODE是否与请求的LOCK MODE兼容,如果不兼则放到WAITER队列中,调用SYSNC_OP,使自己睡眠,当OWNER准备RELEASE LOCK时,检查WAITER是否有SESSION,如果用则调用SYNC_OP来唤醒WAIT的SESSION.在有些平台上使用_USE_VECTOR_POST可以在一个SYCN_OP的操作中唤醒多个WAITER.
可以使用 alter session set events ‘immediate tracename forerver leven N’ 对ENQUEUE进行DUMP.1,ENQUEUE HASH TABLE,2,为HASH TABLE+RESORUCE,3,为HASH TABLE+RESORUCE+LOCK