本文向各位阐述OracleLatch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大的区别。

  Oracle中锁的信息是数据块的一部分,是物理的,并不是逻辑上属于某个表或者某个行。Latch是Oracle提供的轻量级锁资源,他用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,他只工作在内存中, 我们可以不大准确的说,内存中资源的锁叫latch,数据库对象(表,索引等)的锁叫Lock。比如数据缓存中的某个块要被读取,我们会获得这个块的 latch,这个过程叫做pin,另外一个进程恰好要修改这个块,他也要pin这个块,此时他必须等待,当前一个进程释放latch后才能pin住,然后 修改,如果多个进程同时请求的话,他们之间将出现竞争,没有一个入队机制,一旦前面进程释放所定,后面的进程就蜂拥而上,没有先来后到的概念,这个和 Lock是有本质区别的,这一切都发生的非常快,因为Latch的特点是快而短暂,当然这个只是大致过程,细节部分在后面讨论

  先来看下Latch和Lock的区别,

  1. Latch是对内存数据结构提供互斥访问的一种机制,而Lock是以不同的模式来套取共享资源对象,各个模式间存在着兼容或排斥,从这点看出,Latch 的访问,包括查询也是互斥的,任何时候,只能有一个进程能pin住内存的某一块,幸好这个过程是相当的短暂,否则系统性能将没的保障,现在从9I开始,允 许多个进程同时查询相同的内存块,但性能并没有想象中的好。

  2. Latch只作用于内存中,他只能被当前实例访问,而L ock作用于数据库对象,在RAC体系中实例间允许Lock检测与访问

  3. Latch是瞬间的占用,释放,Lock的释放需要等到事务正确的结束,他占用的时间长短由事务大小决定

  4. Latch是非入队的,而Lock是入队的

  5. Latch不存在死锁,而Lock中存在(死锁在Oracle中是非常少见的)

  看看下面这个例子,你会感觉到Latch的存在 

      SQL> CREATE TABLE MYTEST AS SELECT OBJECT_NAME FROM USER_OBJECTS WHERE ROWNUM <= 4; 
  Table created 
  SQL> SET TIMING ON 
  SQL> 
     DECLARE lv_name VARCHAR2(25) := ''; 
    BEGIN 
     FOR i IN 1..100000 LOOP 
         SELECT OBJECT_NAME INTO lv_name FROM MYTEST WHERE ROWNUM = 1; 
     END LOOP; 
   END; 
  / 
  PL/SQL procedure successfully completed 
  Executed in 3.359 seconds

  这个进程不断的访问表上的同一个数据块,他先会物理读取数据块到数据缓冲区,然后在内存中不断的获取这个块的latch,现在只有单个进程,运 行的还好,10万次用了3秒多,但当我拉出4个窗口同时并发的运行这个语句时,问题就出现了,多个进程PIN同一个数据块,每个大概花了15秒,并且看到 他们一个一个的结束,到最后只剩一个时一闪就过去了,因为没人和他抢了,这个实验展现了Latch竞争的现象,对于9I提出的查询可以共享Latch在此 我表示了质疑。

产生Latch的原因主要是:

1、太多的会话访问相同的数据块导致热块的产生

2、共享池有太多的sql语句需要软解析,没有使用绑定变量

  现在来看看进程获取Latch的详细过程,任何时候,只有一个进程可以访问内存中的某一个块(9I提出的Latch共享我不想考虑),如果进程 因为别的进程正占用块而无法获得Latch时,他会对CPU进行一次spin(旋转),时间非常的短暂,spin过后继续获取,不成功仍然spin,直到 spin次数到达阀值限制(这个由隐含参数_spin_count指定),此时进程会停止spin,进行短期的休眠,休眠过后会继续刚才的动作,直到获取 块上的Latch为止。进程休眠的时间也是存在算法的,他会随着spin次数而递增,以厘秒为单位,如1,1,2,2,4,4,8,8,。。。休眠的阀值 限制由隐含参数_max_exponential_sleep控制,默认是2秒,如果当前进程已经占用了别的Latch,则他的休眠时间不会太长(过长会 引起别的进程的Latch等待),此时的休眠最大时间有隐含参数_max_sleep_holding_latch决定,默认是4厘秒。这种时间限制的休 眠又称为短期等待,另外一种情况是长期等待锁存器(Latch Wait Posting),此时等待进程请求Latch不成功,进入休眠,他会向锁存器等待链表(Latch Wait List)压入一条信号,表示获取Latch的请求,当占用进程释放Latch时会检查Latch Wait List,向请求的进程传递一个信号,激活休眠的进程。Latch Wait List是在SGA区维护的一个进程列表,他也需要Latch来保证其正常运行,默认情况下share pool latch和library cache latch是采用这个机制,如果将隐含参数_latch_wait_posting设置为2,则所有Latch都采用这种等待方式,使用这种方式能够比较 精确的唤醒某个等待的进程,但维护Latch Wait List需要系统资源,并且对Latch Wait List上Latch的竞争也可能出现瓶颈。

  如果一个进程请求,旋转,休眠Latch用了很长时间,他会通知PMON进程,查看Latch的占用进程是否已经意外终止或死亡,如果是则PMON会清除释放占用的Latch资源。

  现在大家可以明白,对Latch获取的流程了,请求-SPIN-休眠-请求-SPIN-休眠。。。占用,这里有人会问为什么要SPIN,为什么 不直接休眠等待?这里要明白休眠意味着什么,他意味着暂时的放弃CPU,进行上下文切换(context switch),这样CPU要保存当前进程运行时的一些状态信息,比如堆栈,信号量等数据结构,然后引入后续进程的状态信息,处理完后再切换回原来的进程 状态,这个过程如果频繁的发生在一个高事务,高并发进程的处理系统里面,将是个很昂贵的资源消耗,所以他选择了spin,让进程继续占有CPU,运行一些 空指令,之后继续请求,继续spin,直到达到_spin_count值,这时会放弃CPU,进行短暂的休眠,再继续刚才的动作,Oracle软件就是这 么设计的,世界大师们的杰作,自然有他的道理,我就不在这上面再费文字了。

  系统发生关于Latch的等待是没发避免的,因为这是Oracle的运作机制,当你看到很高的Latch get时并不意味着你的系统需要调整,有时候很高的get值背后只有很短的等待时间,我们调整的对象应该以消耗的时间来圈定,而不是看到一个很高的获取次 数值,当然,获取值异常的高出别的等待时间几十万倍时我们还是要关心的,Oracle关于Latch的等待非常繁多,主要的包括share pool,library cache,cache buffer chains,buffer busy wait,每一个的调整几乎都可以写几页纸,以后慢慢完成吧。

本文转自:http://lzfhope.blog.163.com/blog/static/6363992200951041532317/

转载于:https://www.cnblogs.com/nizuimeiabc1/p/4802624.html

oracle中lock和latch的用途相关推荐

  1. oracle中lock的解释

    数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据 ...

  2. oracle中$lock表,哪张视图可以查询中v$lock表的type的具体含义呢?

    sid是会话id, >6就不知道什么意思了. 你贴的这段代码不灵, 是否阻塞了别人看不出来. [PHP]SID LOCKTYPE                    OBJECT_NAME  ...

  3. Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  4. oracle中的latch: cache buffers chains 与热块

    oracle中的latch: cache buffers chains 与热块 oracle中的latch: cache buffers chains 与热块 ORACLE中的buffer cache ...

  5. oracle中以dba_、user_、v$_、all_、session_、index_开头

    oracle中以dba_.user_.v$_.all_.session_.index_开头的常用表和视图 ----------------------------------------------- ...

  6. oracle dba开头的表,oracle中以dba_、user_、v$_、all_、session_、index_开头的常用表和视图...

    oracle中以dba_.user_.v$_.all_.session_.index_开头的常用表和视图 ----------------------------------------------- ...

  7. Oracle中的AWR,全称为Automatic Workload Repository

    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库.它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时 ...

  8. oracle锁类型tx,Oracle中的锁类型

    Oracle中的锁类型主要分以下3种: DML锁(DML lock):DML 代表数据操纵语言(Data Manipulation Language).一般来讲,表示select,insert,upd ...

  9. oracle中栓锁,oracle 闩锁介绍

    oracle通过闩锁(latch)和锁定(lock)来实现资源的串行化.闩锁和锁定相同点是:都是用于实现保护数据的完整与准确性.不同点是:闩锁是 一个低级别,轻量级的锁,获得和释放的速度非常快.而锁定 ...

最新文章

  1. openchain 环境部署
  2. 【个人总结】知识晶体的前中后台
  3. Linux常用服务部署与优化之NFS篇
  4. java newdirectorystream_Path、Paths和DirectoryStreamT
  5. 利用pylot进行性能测试
  6. 前端学习(1036):bootstrap-js插件2
  7. 信息学奥赛一本通(1183:病人排队)
  8. 精通Android自定义View(九)绘制篇Canvas分析之绘制图片
  9. 广度优先搜索——USACO08FEB(洛谷 P2895)
  10. php 打印 trace,php xdebug trace 调试的问题
  11. Akka和Actor一起工作的消息《ten》译
  12. Python生成舒尔特的Excel表格
  13. 《JavaScript高级程序设计》学习笔记 JavaScript基本(1)
  14. 18 个开源翻译工具帮助你的项目本地化
  15. 在Python中安装meta模块
  16. 计算机博弈之国际跳棋入门-规则篇
  17. 最好的 6 个免费天气 API 接口对比测评
  18. 自监督学习在计算机视觉中的应用
  19. world wind java sdk_World wind Java SDK安装开发测试
  20. vue v-html 中@click 和 class 不生效问题解决方案

热门文章

  1. 【Get 以太坊技能】CentOS 7 Geth安装
  2. 【SSL】keytool复制证书
  3. endnotex9如何导入caj中文文献_EndNote系列教程(二)——数据库的建立及文献的筛选...
  4. 石头扫地机器人离线了怎么办_关于激光头故障,石头扫地机器人无限次复活记!...
  5. java学绘图吗_Java绘图
  6. matlab 三角形隶属函数,在MATLAB模糊逻辑工具箱中,常用的隶属函数有:
  7. c语言左移15位,关于c语言中左移右移运算符的问题
  8. docker安装配置分布式elasticsearch、kibana、head、cerebro
  9. Unable to find 'struts.multipart.saveDir' property setting.
  10. 十七、Pytorch的安装和使用