Oracle core06_latch&lock
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的更多相关文章
- [Oracle]TM lock (DML enqueue) 的相容性
[Oracle]TM lock (DML enqueue) 的相容性 RS(SS): 行共享 LMODE =2 RX(SX): 行独占 LMODE =3 S: 共享 ...
- ORACLE V$lock视图TYPE,ID1,ID2取值的含义
在oracle v$lock视图中,下面对type,ID1,ID2三个列的具体含义说明下: TYPE 有TM,TX两种类型,TX为行级锁,事物锁,TM锁为表级锁 TYPE ID1 ID2 TM 被 ...
- 05 oracle中lock和latch的用途
oracle中lock和latch的用途 本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁 ...
- oracle中lock和latch的用途
本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大 ...
- ORACLE -- ArcSDE Lock request conflicts with an established lock【转】
具体的解决办法有如下三种 1.多半情况下关闭数据库连接可以解决这个问题,但有时候问题依然存在. 2. >1.关闭所有的ArcMap和ArcCatalog session. >2.开始——运 ...
- Oracle - v$lock查询慢原因分析
数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...
- Oracle AWR报告指标全解析-11011552
1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...
- oracleDB python chines_miscode
oracle account lock: solutionhttp://www.cnblogs.com/jianqiang2010/archive/2011/09/01/2162574.html li ...
- 2013-06-09 12:03 如何在SQLServer中锁定某行记录
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订 ...
随机推荐
- Android数据存储技术
Android提供了4种数据存储技术,分别是SharedPreferences.Files.SQLite数据库和网络存储数据.(有的开发者认为使用ContentProvider也可以算是一种,但我觉得 ...
- 那天有个小孩跟我说LINQ(二)转载
1 LINQ TO Objects续(代码下载) 新建项目 linq_Ch2控制台程序,新建一个Entity文件夹 1.1 学生成绩查询(练习Join) 有三张表如下 ...
- leetcode处女作
闲来无事[真的吗?你确定→_→ 在leetcode上刷了一道题.费时一小时,也是醉了.谨以此文,纪念我的伟大成果.[呵呵 题目是找出非排序数组中缺少的最小正整数.要求时间复杂度O(n),空间复杂度为常 ...
- windows访问linux共享
1. 安装samba yum install samba 2. 配置samba配置文件,添加共享文件夹 vim /etc/samba/smb.conf 3. 关闭selinux vi /etc ...
- Cogs 1008. 贪婪大陆(树状数组)
贪婪大陆 难度等级 ★★ 时间限制 1000 ms (1 s) 内存限制 128 MB 测试数据 10 简单对比 输入文件:greedisland.in 输出文件:greedisland.out 简单 ...
- OpenJudge 2815 城堡问题 / Poj 1164 The Castle
1.链接地址: http://bailian.openjudge.cn/practice/2815/ http://poj.org/problem?id=1164 2.题目: 总时间限制: 1000m ...
- WORDPRESS插件开发学习(一)HELLO WORLD
WORDPRESS插件开发学习系列文章第一篇,在每篇文章的后面追加固定的字符“Hello World” 一.打开wordpress目录->wp-content->plugins 二.在pl ...
- 关于APlayer播放器在打包安装后提示“没有注册类”的解决办法
1.首先需要确定必要的DLL文件都已经在正确的安装目录下了: 2.项目中引用的DLL必须是Debug目录下的: 3.若后续修改或者重新注册了APlayer组件,那么所有的DLL都需要替换成最新的. 关 ...
- linux下 链接 sqlserver数据库 驱动的安装
1.必需安装freetds 安装pdo_dblib扩展首先需要安装freetds. freeTDS的最新稳定版是0.91,这个可以在官网上下载http://www.freetds.org/ ,也可以在 ...
- oracle工具 sqlplus 用户管理
可以通过system用户对普通用户解锁.alter user scott account unlock; 工具:1/ sqlplusw sqlplus 自带.调用oracle安装目录下bin目录下的e ...