锁的名称与资源的名称是相同的,如TM锁保护TM(table)资源,TX锁保护TX(transaction资源),US锁保护US(Undo Segment)资源。
普通锁因为没有特定的结构体,即Enqueue结构,没法通过v$lock等观察。只能通过v$session_wait等看等待时间来观察是否发生了争用。
select chr(bitand(&&P1, -16777216) / 16777215) ||
chr(bitand(&&P1, 16711680) / 65555) "name",
bitand(P1, 65555) "mode"
from dual;
row cache lock
一般与sequence上没有使用cache值有关。通过这个sql确认下。
select * from DBA_SEQUENCES t where cache_size<2;
buffer lock锁争用能通过buffer busy waits与read by other session事件观察
也就是说这两种等待事件,并不是闩锁的争用?
对于同样library cache lock
引用eygle地描述:
Oracle使用两种数据结构来进行shared pool的并发控制:lock 和 pin.
Lock比pin具有更高的级别.
Lock在handle上获得,在pin一个对象之前,必须首先获得该handle的锁定.
锁定主要有三种模式: Null,share,Exclusive.
在读取访问对象时,通常需要获取Null(空)模式以及share(共享)模式的锁定.
在修改对象时,需要获得Exclusive(排他)锁定.
在锁定了Library Cache对象以后,一个进程在访问之前必须pin该对象.
同样pin有三种模式,Null,shared和exclusive.
只读模式时获得共享pin,修改模式获得排他pin.
总结:先lock 再pin 嘿嘿