Library cache lock:
这个锁的作用是控制多个Oracle客户端对同一个LIBRARY CACHE对象的并发访问。通过对LIBRARY CACHE OBJECT HANDLE上加锁来防止非兼容的访问。包括:
- 一个客户端可以通过这个锁来防止其他客户端访问这个对象
- 一个客户端可以在一个相对长的时间内防止某个对象被修改(比如为了分析某个SQL的过程中防止某个存储过程被修改)
- 一个客户端在共享池中查找某个对象也可以使用这个锁
当SQL和PL/SQL分析的时候,able, view, procedure, function, package, package body, trigger, index, cluster, synonym这些对象使用这个锁来保护。而CURSOR,PL/SQL片段以及一些瞬时对象不使用该锁。
Library cache pin:
当一个对象要被装载到内存中的时候,需要使用Library cache pin,如果一个客户端要修改或者查看某个对象的时候,在library cache lock后,需要加library cache pin。
如我们以前讨论过的,一个对象在共享池中包括HANDLE(KGLHD)以及kglob,kglna,只有当这3个部分都在内存中,才能够持有library cache pin。
library cache lock和Library cache pin都是为了并发访问共享池对象的。lock是为了在客户端中进行同步,而pin是为了保护共享内存的访问。LOCK可能会产生死锁,而且死锁对于访问性能影响较大。而PIN对于死锁不敏感。
参考资料METALINK NOTE:444561.1
可以通过 X$KGLLK 和 X$KGLPN来查看LOCK 和PIN