lock and latch

在oracle中为了保护共享资源,使用了两种不同的锁机制lock和latch,这两种锁有明显不同点:

1,lock和pin,采用的是队列的方式,先来先服务的策略,latch和mutex,采用的是抢占的方式,fast fail模式
2,lock可以hold的时间比较长,而latch时间会非常的短
3,lock主要用户锁定对象,面向用户,latch主要锁定的是内存,面向系统

理解这两种锁的设计思想,可以应用在实际的生产过程中,首先:

1,这两种锁的粒度不同,一个粒度粗,一个粒度细
2,根据不同的场景,设计适合场景的锁机制


因为latch保护的内存中的数据,而数据的组织oracle使用了多种方式:

1,array

主要使用固定长度的对象的集合,这样可以直接定位到任意对象的地址,在空间的分配上,
可以一次分配定长或者递增长度的chunk。

2,linked list

这里可以是单向的链表,或者双向的链表,linked list是比较常用的结构,比如index中的leaf block。
linked list可以组织成FIFO的队列,也可以组织成LIFO的堆栈。

3,B 树

B数数据结构,是oracle在index中使用的方式,查找的效率和数的高度有关。\

4,hash table

在数据量比较小的时候,可以使用array或者linked List,但是,当数据量比较大的时候,查找的时间效率上,hash table会更有效率,时间复杂度是O(1)。

在对目前常用的数据结构中,对于查询而言,有三种方式效率比较高:

1,二分查找
  这需要数据时有序的,
2,B 树查找
  在大并发的修改情况下,会有瓶颈
3,hash表
  查找的效率是O(1),比较适合大并发的修改情况下使用

所以,在oracle中,对大量小的内存空间的并发管理上,通常使用hash table数据结构。
hash的主要思想是:
设定一个固定的数量的bucket(通常是2的幂次方),然后对对象应用hash函数,映射到其中的一个bucket当中。

但bucket的数量,hash算法等会影响到管理和使用的开销。
这里有几个原则:

1,不同的对象可能映射到同一个bucket中
2,同一个bucket中不能有太多的对象
3,hash算法尽量要是对象分布均衡

对于每一个bucket中,多个对象使用linked list进行组合,例如library cache中的对象,包括两个结构,
hash bucket,hash chain。

这里对oracle的阻塞的概念做一个解释:

1,多版本一致,读写互不阻塞
  这是对用户而言,在data level,在使用oracle时,访问和修改数据可以做到,读读不阻塞,读写不阻塞,写写阻塞,因为oracle使用undo机制实现了多版本一致性
2,内存结构,互相阻塞
  对于oracle的内存结构,在raw memory level,使用latch的方式,写是独占锁,读是共享锁,实现了读读不阻塞,读写阻塞,写写阻塞的方式。所以对于latch而言,获取和释放latch的速度要非常快,以减少更改内存结构的过程中,对读的阻塞。

所以,通常的应用设计过程中,第一种更多是对热点数据的修改争用,造成的enqueue,相比较而言,对应用服务器的可扩展性和并发能力产生很大的影响,而第二种可能是应用设计的不合理,而latch对oracle数据库系统的并发能力和可扩展性的影响更大,因为其不能做到读写互不阻塞,并发能力大大减弱。

latch:

1,本质:

  latch的本质其实是信号量,使用内存的一个地址进行存储,并对信号量进行一系列的原子操作。在多用户系统下,原子操作意味着其不会被进程的调度所中断,
在原子操作的生命周期会完全占有cpu,在多cpu的架构上,通过独占内存总线来实现原子操作。

在oracle中,latch分为exclusive和shared模式,在reader和write的逻辑处理上,有两种模型:

1,check and change
  首先writer去check信号量的值,发现为zero,就去修改,然后就相当于获得了latch,就可以修改latch所保护的对象了。这里包含了两个操作,一个是check,
一个是change,当处在多线程处理中,或者多cpu架构中,就会破坏一致性。

2,compare and swap
  设置一个flag,使用寄存器保存信号量的值,当flag没有被设置的时候,writer设置flag,这时开始阻塞了reader再去更改信号量,writer开始不停的compare两个,
当值相等的时候,即reader已经释放完shared latch的时候,writer就可以独占latch了。

2,latch统计

  当session获取latch的过程中,如果重试,在重试一定次数的时候,进入sleep,这时并不像enqueue一样,会有FIFO管理队列来管理阻塞的情况,直到被唤醒。
而因为获取latch而sleep的session会被os offline cpu的运行队列中,进入wait list。然后会被被唤醒重试。

3,latch scalability

这里主要是两个方面,latch的数量和latch获得的时间:

1.  latch数量:这里是一个平衡点,latch数量少,你们一个latch管理的恭喜主要就比较多,会产生严重的争用,但当为每一个恭喜主要分配一个latch的时候,系统管理latch的开销又会大幅升高。所以针对library cache中hash bucket,oracle通常设置了cpu_count个latch来管理,在oracle 11g中,采用了mutexes来替代latch来管理部分latch,即针对每一个object分配一个mutex,这样大大减少了争用。

2.  latch时间:latch hold的时候尽可能的要短,减少争用。

Oracle core06_latch&lock的更多相关文章

  1. [Oracle]TM lock (DML enqueue) 的相容性

    [Oracle]TM lock (DML enqueue) 的相容性 RS(SS):  行共享     LMODE =2 RX(SX):  行独占     LMODE =3 S:       共享   ...

  2. ORACLE V$lock视图TYPE,ID1,ID2取值的含义

    在oracle v$lock视图中,下面对type,ID1,ID2三个列的具体含义说明下: TYPE   有TM,TX两种类型,TX为行级锁,事物锁,TM锁为表级锁 TYPE ID1 ID2 TM 被 ...

  3. 05 oracle中lock和latch的用途

    oracle中lock和latch的用途   本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁 ...

  4. oracle中lock和latch的用途

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

  5. ORACLE -- ArcSDE Lock request conflicts with an established lock【转】

    具体的解决办法有如下三种 1.多半情况下关闭数据库连接可以解决这个问题,但有时候问题依然存在. 2. >1.关闭所有的ArcMap和ArcCatalog session. >2.开始——运 ...

  6. Oracle - v$lock查询慢原因分析

    数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...

  7. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  8. oracleDB python chines_miscode

    oracle account lock: solutionhttp://www.cnblogs.com/jianqiang2010/archive/2011/09/01/2162574.html li ...

  9. 2013-06-09 12:03 如何在SQLServer中锁定某行记录

    锁的概述  一. 为什么要引入锁  多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:  丢失更新  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订 ...

随机推荐

  1. 再跟SQL谈一谈--基础篇

    1.简介 2.DDL & DML 3.SELECT ①DISTINCT ②WHERE ③AND & OR ④ORDER BY 4.INSERT 5.UPDATE 6.DELETE 1. ...

  2. SQL Server调优系列基础篇 - 并行运算总结(一)

    前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自 ...

  3. Windows 7中,用Visual Studio开发WPF应用程序,实现从Windows Explorer中拖拽文件到应用程序,始终显示“无法拖放”符号问题解决方案

    Are you running your application or Visual Studio that hosts the app under administrative privilege? ...

  4. Webservice学习之——即时发布与定制发布

    一.工具 myEclipse tomcat  6.0 以上版本 axis-bin-1_4.zip 二.即时发布 1.解压 axis-bin-1_4.zip 2.axis-bin-1_4.zip\axi ...

  5. UIView的常见属性

    UIView的常见属性: @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDyn ...

  6. CSS背景属性

    CSS背景属性 1.background-attachment 属性 scroll:默认值.背景图像会随着页面其余部分的滚动而移动. fixed:当页面的其余部分滚动时,背景图像不会移动. inher ...

  7. JS实现回到页面顶部动画效果 2016.03.23

    最近在模仿各大网站写页面样式和交互,发现好多都有回到顶部的需要,所以写了一下js,记录下来. 发现还可以添加从快到慢的动画效果和随时下拉滚动条停止滚动的功能, 参考了imooc上相关课程,最终实现JS ...

  8. Source Insight及常用插件

    Source Insight及常用插件 1.Source Insight 2.插件 <1>.使用快捷键注释,单行注释,多行注释,#if 0注释 <2>.跳转到当前文件所在的文件 ...

  9. 输出图像到文件 imwrite()[OpenCV 笔记7]

    bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector& ...

  10. 某Python群的入群题目

    为了确保不被通过搜索引擎直接搜索题目搜出来,我重新描述下题目: 给n, 求1~n的每个数的约数和 每个约数出现的个数是 n // i个, 出现x次的约数范围是[n // (i + 1) + 1, n ...