在oracle眼里,锁不是稀有资源,相反地,只要需要,你就应该长期地持有对数据所加的锁。行级锁根本没有相关开销,对1千万行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是个常量。
在SGA中和锁相关的内存有两块:队列资源池和锁池。池:指的就是一块固定大小的内存。
队列资源池:存放所有的队列资源.锁就是队列资源。
例如:一个表上的TM锁就是一个队列资源,有多少个表就有多少个TM队列资源,如果有一个表的TM锁被持有,他就会被放进队列资源池。为了对他们加以区分,要为各个表的TM队列资源起个名字,名字的格式'队列资源类型-id1-id2‘。
例如:
两个会话修改了同一个表的不同行,两个会话并不互相阻塞.表的ID是2000,这里我们以TM锁为例,队列资源池中会有一个空闲条目被占用,其名字是
锁池:会话持有任意一个队列资源的信息,保存在锁池中。某一个队列资源上的等待者和持有者相关的信息,并不在队列资源池中存储,而是在锁池搁着。锁池和队列资源池中的信息合一起 称呼为一个队列资源锁.
10g队列资源池和锁池的大小:
SQL> select RESOURCE_NAME,INITIAL_ALLOCATION from v$resource_limit where resource_name='enqueue_resources';
RESOURCE_NAME INITIAL_ALLOCATION
-------------------- --------------------
enqueue_resources 968
如上显示,10G中默认的队列资源池初始分配968个条目.每个队列资源条目在池中只占很少的信息,而一个队列资源上真正的锁信息是记录在锁池中的。
SQL> select RESOURCE_NAME,INITIAL_ALLOCATION from v$resource_limit where resource_name='enqueue_locks';
RESOURCE_NAME INITIAL_ALLOCATION
-------------------- --------------------
enqueue_locks 2300
上图是分别在10和12号会话修改6657表后,队列资源