Oracle database使用不同种类的系统锁来保护内部的database和memory的结构。这种机制对于用户是不可达的,用户对他们的发生没有任何控制前。
Latch 是简单地低级的序列机制,协调多个用户访问共享数据结构,object和文件。
Latch保护共享内存资源被多个进程访问导致的崩溃。Latch保护以下情况的数据结构
多个session并发修改
一个session在修改数据,另一个session在读数据
处理的时候,重新分配内存
很简单地说:单个latch保护SGA中的多个对象。比如,类似于DBWN和LGWR的后台进程从共享池中分配资源来创建数据结构。分配内存的时候,这些进程使用一个shared pool latch来串行化访问来避免两个process同时检查或者修改数据。内存分配完之后,别的进程可能需要访问共享池,比如library cache,这是解析需要的过程。这种情况下,进程只latch住library cache,而不是整个shared pool。
不像是row locks的队列latch,latch不允许sessions排队。一个latch可用的时候,第一个请求latch的session,这个session就能独占这个latch。在一个loop中,进程重复请求latch的时候,latch旋转就发生了,如果一个进程在更新latch 请求之前,释放了CPU的时候,latch 睡眠就会发生。
典型地说,oracle进程在操作或者寻找数据结构的时候,会在很短时间内获得一个latch。
在更新一个单独员工的salary的时候,database会释放上千个latch。Latch的实现是基于OS的,尤其是基于process等待了多久latch。
Latch增加会降低并发性。比如,过多的hardparse操作会创建library cache latch的争用。
ORACLE内部提供了一个视图 v$LATCH包含了每一个latch的具体使用的信息,包括每个latch请求和等待的次数。
转载于:https://blog.51cto.com/yuangeqingtian/1345700