日期:2014-05-16 浏览次数:20410 次
oracle library cache pin、library cache lock原理分析。
今天是2013-11-2,前段时间一直在研究oracle中复杂的component之shared pool,今天也不例外,对library cache lock、library cache pin进行一下深入的研究,
另外呢,在后边一篇文章也会通过案例来介绍相应的cursor:pin s on wait x等待的原理以及处理办法。
在研究本章内容之前啊,建议懂得一些shared pool的相关知识,我之前写过相关的blog日志,虽然谈不上什么经典,但是也可以帮我提提意见。
具体参考:
http://blog.csdn.net/xiaohai20102010/article/details/12921645
第一:原理知识:
1、什么是library cache lock?
官方文档有如下说明:
This event controls the concurrency between clients of the library cache. It acquires a lock on the object handle so that either:
One client can prevent other clients from accessing the same object
The client can maintain a dependency for a long time (for example, no other client can change the object)
This lock is also obtained to locate an object in the library cache.
Wait Time: 3 seconds (1 second for PMON)
Parameter Description
object address Address of the object being loaded
lock address Address of load lock being used
mask Indicates which data pieces of the object that needs to be loaded
翻译一下:在这个library cache lock控制library cache的并发管理,以便。
1)一个客户端可以阻止其他的客户端访问同一个对象
2)这个客户端可以长时间的维护一个依赖对象(例如,没有其他用户可以修改该对象)
这种锁在用户试图在library cache中查询定位对象的时候也会获得。对于该锁有三种模式分别是null、share、exclusive,对于该锁的获得等待三秒,一秒用于pmon进程如果超过3秒那么就
会产生等待。
那对于上面说的1和2怎么理解呢?
在我们解析sql或是编译pl/sql语句期间,我们需要获得被应用的数据库对象(表,视图,过程,函数,包,包体,触发器,索引,聚簇,同义词)的library cache lock;这个锁在解析与编
译结束时会被释放。注意:cursor(sql与pl/sql区),管道(pipes)和其他瞬时(transient)对象不适用该锁,library cache lock上的死锁不会被自动检测到,对其的操作是瞎子进行的
。
2、为什么需要library cache lock
library cache lock是在对象和他们的sql语句之间维持了一种依赖对象机制,假如对象的定义(如字段)被重新定义了或是这个解析锁被“损坏”了,那么依赖对象肯定也失效了,这种维持就
是通过library cache lock实现的。举个例子来说,如果一个表的字段被删除了,那么所有依赖该表的sql将都会变的失效了,必须在下一次访问该 对象的时候重新进行解析,那么library
cache lock就是实现这种机制。而这也是需要有一个队列的,library cache lock是在library cache handle上获得,如果存在不兼容的模式,那么其他的会话必须这时候进行等待。
3、什么是library cache pin?
官方介绍为:
This event manages library cache concurrency. Pinning an object causes the heaps to be loaded into memory. If a client wants to modify or examine the object, the
client must acquire a pin after the lock.
Wait Time: 3 seconds (1 second for PMON)
Parameter Description
handle address Address of the object being loaded
pin address Address of the load lock being used. This is not the same thing as a latch or an enqueue, it is basically a State Object.
mode Indicates which data pieces of the object that needs to be loaded
namespace
翻译一下:
这个library cache pin是维护管理library cache的并发性。在pin一个对象的时候将会把heap载入到内存中,如果一个会话视图编辑或是检查这个对象的时候在获得lock之后必须获得pin。
对于heap怎么理解?它是内存堆,里面包含了很多信息,可以看一下下图就明白了。
同样library cache pin也有三种模式分别是null,share、exclusive,当需要访问被缓存到library cache中的数据对象的时候(如,表,索引,聚簇,同义词,视图,过程,包,包体,触
发器、)必须要先pin,当出现library cache pin等待的时候那么这个对象正在被其他会话进行不兼容的模式持有。对于以上的参数,下边会有介绍,就不在这个小命题说了。
4、我为什么需要library cache pin?
library cache pin是为了处理当前执行依赖对象的,例如,当一个会话在执行访问(sql)这个加载的对象的时候不应该被修改。也就是说,当一个解析锁在没有释放之前,其他会话必须获
得library cache pin 的exclusive模式才能将该对象进行修改。同时,可以想象一个长的sql可能会导致library cache pin的等待。
到了这里我发现,对于library cache 有两种锁,一种为lock另一种是pin,lock是存在于library cache object handle上的,而pin是为了在内存堆维持object的一致性。oracle在sql解析
或是编译对象的时候需要获得library cache lock和library cache pin,防止其他会话对执行的sql对象进行修改。另外在sql的硬解析的时候会获得library cache lock,阻止其他会话对对
象的修改,那么其他会话就会发生等待。
5、什么是library cache load lock?
官方解释:
The session tries to find the load lock for the database object so that it can load the object. The load lock is always obtained in Exclusive mode, so that no othe