Oracle中的锁和10704对高级队列锁的跟踪实验
<p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 0px 15px; text-indent: 2em; color: rgb(51, 51, 51); font-family: &quot;Microsoft YaHei&quot;; font-size: 14px; white-space: normal; background-color: rgb(244, 244, 244);"><span style="line-height: 1.5;">锁是数据库用来控制共享资源并发访问的机制,是用来保护和用户相关的资源,如:表、用户、会话等。 本文以Oracle中锁的种类和模式讲起,后用10704做实验观察不同sql语句下锁持有情况的不同,主要以TM锁为例。 小弟初学Oracle,如果错误还望多多包涵和留言指出。</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 0px 15px; text-indent: 2em; color: rgb(51, 51, 51); font-family: &quot;Microsoft YaHei&quot;; font-size: 14px; white-space: normal; background-color: rgb(244, 244, 244);">一、Oracle锁的种类 Oracle里锁分为三大类: 高级队列锁:TM,TX锁等等 视图V$LOCK 中级内存锁:Library cache lock Library cache pin(堆) Row cache lock; Buffer pin lock; 低级内存锁:Latch Mutex</p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 0px 15px; text-indent: 2em; color: rgb(51, 51, 51); font-family: &quot;Microsoft YaHei&quot;; font-size: 14px; white-space: normal; background-color: rgb(244, 244, 244);"><span style="line-height: 1.5;">高级队列锁Lock与低级内存锁的区别: 1.Lock的种类多,如TM,TX,TT等等; 2.Lock作用于数据库Object,Lacth只作用于SGA内存中; 3.Lock的释放需要等到事务结束,Latch是瞬间的占用和释放; 4.Lock存在死锁,Latch不存在死锁(因free lock机制)</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 0px 15px; text-indent: 2em; color: rgb(51, 51, 51); font-family: &quot;Microsoft YaHei&quot;; font-size: 14px; white-space: normal; background-color: rgb(244, 244, 244);"><span style="line-height: 1.5;">低级内存锁与中级内存锁的区别,主要在于低级内存锁有lock free机制(无锁式编程): 即请求latch时,如果该latch不可用,进程会在CPU中等待小段时间(spin)然后重新请求latch。 如果依然不可用,该进程会重复以上步骤去请求latch。重复的次数默认值为2000(mutex为500)。 如果在重复次数内还是请求不到latch,进程会在v$session_wait中记录latch free等待事件,然后释放cpu, 转入睡眠状态。当睡眠一定时间后,进程被唤醒并重复上面的过程,一直到成功获取latch。因此低级内存锁避免了死锁的存在。 此外,中级内存锁往往执行多条记录才会释放,而低级内存锁执行几条就可能会释放。</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 0px 15px; text-indent: 2em; color: rgb(51, 51, 51); font-family: &quot;Microsoft YaHei&quot;; font-size: 14px; white-space: normal; background-color: rgb(244, 244, 244);"><span style="line-height: 1.5;">二、Oracle锁的模式 锁模式可粗略的分为空锁,共享和独占: 空 锁:1号锁,空锁,通常只起标志性作用,保证内存不会被释放。 共享锁:2-5号锁,包括RS(行共享)、RX(行专用)、S(共享锁)、SRX(共享行专用),允许部分DML操作,数字越大影响的操作越大。 独占锁:6号锁,exclusive独立访问使用,是限制最高级别的锁,禁止所有DML操作。 说明:Oracle中多数锁都是有着多种模式的,除高级队列锁TM外,中级内存锁Library Cache Lock/pin、buffer pin也是有多种模式的。 本文主要以跟踪高级队列锁为主: TM锁定的是对象,所以叫对象锁,或者表锁,用来阻塞DML(或DDL)的运行,通常是持有2-6号锁,1号较少。 TX即事务独占锁,是所有加在行上的锁的总称。模式只有两种,要么无锁,要么独占锁(6号);</span></p><p><br/></p>

CopyRight 2020 All Right Reserved 济南金付宝数字科技有限公司 鲁ICP备20031440号