latch入门

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 03:29 点击:

片头语:最近有点忙,一天一更可能做不到了,不管如何日志还是要坚持写下去的~
锁定这个话题其实算是dbms比较底层的东西了,会去研究这个东西的原因是因为jj大神说他的一句sql导致cpu占用率很高,当然,他用的是mysql不是oracle,我也不是很明白,但是发现在oracle中锁定是很有可能导致cpu占用的原因,于是开始着手研究oracle的锁机制。

数据库的锁定,那这个肯定是不用多说了,为了在并发的情况下保证数据的一致性,在数据库系统中无一例外地引入了锁的机制,那在oracle中就借用了非常著名的两种锁,latch闩锁以及lock锁定。

lock的话就是数据库原理上提到的那种锁定,为了保证数据库的一致性和完整性,对事务进行锁定,包括共享锁和排他锁啊等等,有关于lock我们以后再说,今天的主角是latch。那latch究竟是什么呢?说实话,o小白也说不太清楚。latch的种类繁多,所以o小白只是以目前比较粗浅的理解和查阅的一些书籍和资料,总结出以下几点:

1.latch是为了保护内存(SGA)的。也就是说,latch和数据库书本上的什么update的顺序啊什么的毫无关系。这样来说吧,lock是针对数据库对象的,比如表啊,索引啊,视图啊这些的,但是latch是针对内存当中的某个数据结构的。不知道大家还记不记得o小白前面某篇文章中提到的pin,其实pin就是获得latch的这个过程。

2.一个服务器进程无论是对内存中的数据结构进行访问还是操作都是互斥的,也就是说无论读写都必须先pin住这个数据结构,而其他进程则必须进行等待。(有shared latch,以后再提)

3.latch是非常轻量级的,通常只会hold住极短的时间,而且latch的实现和操作系统有关(操作系统中是通过信号量来实现共享资源的获取和访问的),如果对操作系统知识不熟的话可以简单理解成一个变量来控制latch,如果是0则说明目前这个latch是空闲的,否则就是被获取了。

latch可以分成两种类型:

1.willing-to-wait,这种方式实现的方法是test-and-set,也就是说如果当前进程不能获得latch,那会绕着cpu旋转,而不是放弃cpu,也就是spin,原理就是执行一段空的循环。那为什么会这样呢,为什么不释放cpu呢?由于latch的一个特点是他是非常轻量级的,可以在极短时间内被前一个占有的进程锁释放,如果不能获得latch就立刻释放cpu的话那就要进行上下文切换,而下次尝试获得latch时则又要进行上下文切换,那为了减少上下文切换的次数这里就采用了这种自旋的方式。当然,自旋也是有一个上限次数的,oracle的一个隐藏参数_spin_count当中记录了这个值,如果超过这个参数就那这个进程就释放cpu进入睡眠状态。(然后这里有了争议,传统的说法是在睡眠了一段时间以后会醒来,但是也有人说是进入了一个队列,直到latch被释放后oracle自动会唤醒队列中的第一个进程,那这个o小白也不知道如何验证,这里就暂且放下,日后得到高人指点以后再和大家分享,先给出链接。

2.no-wait,也叫immediate这种latch的条件便是拥有很多个可用的latch,当一个进程申请latch失败后,则会申请另一个equivalent sibling latch(翻译不来),如果所有的latch都不是空闲的,才会进入等待的状态。这种latch并不是很常见。

那上文也提到,说latch可能导致cpu使用率过高?这是什么原因呢?如果sql语句被大量的进行解析(未使用绑定变量),又或者sql语句本身比较低效需要读大量的数据,那一定会引起很多的latch争用,根据上面的spin所说,cpu一直在旋转自然可能导致cpu使用率过高,所以良好的sql语句书写习惯和sql语句优化是非常重要的。

那今天主要是latch的一些概念,latch具体分成很多种类,那下一篇o小白将会对常见的latch做一些展示和说明,敬请期待。

ps:其实latch中有一个非常著名的shared latch,上面介绍的都没有考虑这种类型的latch,怎么说呢,latch虽然很少提到这两个,不过存在还是有他的道理的,也会跟后面latch在11g中引入的新特性有关,那篇幅关系,还是期待后面的篇章吧。

本文出自 “oracle小白前进之路” 博客

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Table函数使用简介
      • Oracle数据库Constraint约束的常用操作及异常处理
      • Bulk Collect性能分析(zz)
      • export/import的使用
      • OCP043第十五讲 Database Security
      • ORACLE10gr2数据导入MySQL方案
      • oracle 让sys用户可以使用isqlplus
      • 在oracle数据库下使用iSQL*Plus DBA访问数据库
      • Oracle行列转换小结
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1