题目部分

在Oracle中,Lock、Latch和Pin的区别有哪些?

答案部分

Latch是Oracle提供的轻量级锁,它用于快速,短时间的锁定资源,可防止多个并发进程同时修改内存中的某个共享资源,它只工作在内存中。内存中资源的锁叫Latch(闩),而​​数据库​​对象(表,索引等)的锁叫Lock,也被称为队列锁(Enqueue Lock)。如果要读取数据缓存中的某个块,那么Oracle会获得这个块的Latch,这个过程叫做Pin。此时,若另外一个进程恰好要修改这个块,则它也要Pin这个块,此时它必须等待。当前一个进程释放Latch后才能Pin住,然后修改。如果多个进程同时请求的话,那么它们之间将会出现竞争。Latch没有一个入队机制,一旦前面进程释放Latch,后面的进程就蜂拥而上,没有先来后到的概念,这个和Lock是有本质区别的,这一切都发生的非常快,因为Latch的特点是快而短暂。

具体而言,Latch和Lock有如下几点不同:

① Latch是针对内存中的数据结构提供的一种互斥访问的机制,大多情况下只有X(独占排它模式),而Lock是以不同的模式来共享资源对象,各个模式间存在着兼容(共享模式,S)或互斥模式(独占排它模式,S)。

② Latch只作用于内存中,它只能被当前实例访问,而Lock作用于数据库对象,在RAC体系中实例间允许Lock检测与访问。

③ Latch是瞬间的占用,释放(CPU处理完成后立即释放),时间极短,Lock的释放需要等到事务正确的结束,它占用的时间长短由事务大小决定。

④ Latch是非入队的,随机且无规律的,而Lock是入队的,即先请求先获取。

⑤ Latch不存在死锁,而Lock中存在。

⑥ Latch是十分轻量级的,而Lock是复杂的结构。

⑦ Latch锁定的是较小的内存对象,易于被CPU快速处理,一般为底层内存结构体,例如Buffer Cache或Shared Pool中的对象。Lock锁定的是较大的数据库对象,不易被CPU快速处理,一般为应用结构体,例如表、索引等。