Oracle database使用不同种类的系统锁来保护内部的databasememory的结构。这种机制对于用户是不可达的,用户对他们的发生没有任何控制前。



Latch 是简单地低级的序列机制,协调多个用户访问共享数据结构,object和文件。

Latch保护共享内存资源被多个进程访问导致的崩溃。Latch保护以下情况的数据结构


多个session并发修改

一个session在修改数据,另一个session在读数据

处理的时候,重新分配内存


很简单地说:单个latch保护SGA中的多个对象。比如,类似于DBWNLGWR的后台进程从共享池中分配资源来创建数据结构。分配内存的时候,这些进程使用一个shared pool latch来串行化访问来避免两个process同时检查或者修改数据。内存分配完之后,别的进程可能需要访问共享池,比如library cache,这是解析需要的过程。这种情况下,进程只latchlibrary cache,而不是整个shared pool



不像是row locks的队列latchlatch不允许sessions排队。一个latch可用的时候,第一个请求latchsession,这个session就能独占这个latch。在一个loop中,进程重复请求latch的时候,latch旋转就发生了,如果一个进程在更新latch 请求之前,释放了CPU的时候,latch 睡眠就会发生。



典型地说,oracle进程在操作或者寻找数据结构的时候,会在很短时间内获得一个latch

在更新一个单独员工的salary的时候,database会释放上千个latchLatch的实现是基于OS的,尤其是基于process等待了多久latch



Latch增加会降低并发性。比如,过多的hardparse操作会创建library cache latch的争用。

ORACLE内部提供了一个视图 v$LATCH包含了每一个latch的具体使用的信息,包括每个latch请求和等待的次数。