关于Oracle中的latch和mutex
来源:互联网 发布:软件模块化设计方法 编辑:程序博客网 时间:2024/04/29 09:53
Oracle中的latch的作用?
latch有队列吗?
latch可以共享吗?
latch 和lock的区别?
cbc latch和primay key的关系?
数据库的本质是并发和一致性。为了解决并发访问的问题,才引入了lock和latch。
1.lock是用来保护数据库中的对象的。比如两个session试图同时更新同一行数据,就会有TX lock产生。
2.latch是用来保护内存中的数据结构的。主要是链表,数组,队列等等。我们看这个图,如果想向链表中插入一个新的数据块。
首先就要对这个链表用latch进行保护,然后才能将新的数据块挂入链中。然后再释放latch
否则,如果有两个进程同时修改这个链表,就乱套了。这就是latch的作用。保护内存中的数据结构。
3.我们都知道,lock是采用的队列机制,lock也叫做enqueue,采用的是“先到先服务”策略。
4.lock持有的时间很长,而latch往往时间很短。mutex 则介于latch和lock之间。争夺的方式和latch一样,采用随机抢占策略。但是持有的方式和lock一样,可以长期持有。
5.latch的持有方式:独占和共享。独占意味着同一时刻只能有一个会话持有latch,共享意味着多个会话可以同时持有一个latch.
6.我们现在再来看latch的获得方式。Oracle一直在进行改进,自Oracle 9.2.0.6开始,latch的方式就改变了,latch也有队列。
以下来自Andrey Nikolaev的研究成果:
首先以immediate的方式去获得latch,如果没有得到,会spin 2000次,如果还是没有获得latch,进程会附加至一个等待列表中,然后进入睡眠状态。这时我们也许会看到latch free等待事件。
Immediate latch get
spin latch get
Add the process to the queue of latch waiters
sleep until posted
7.这种post/wait机制的latch会带来一些负作用。比如队列中的进程也许永远也不会被唤醒。这样可以通过隐藏参数_enable_reliable_latch_waits来控制。
8.latch的统计信息存在于v$latch中,它是v$latch_parent,v$latch_children的聚合结果。可以通过Tanel Poder 的latch_prof.sql脚本查看latch情况。
9.latch的可扩展性。
由于latch要同时保护很多个数据结构,这导致latch本身就成为了一种竞争资源。比如library cache latch,最大数为67,就可能产生争用。这样就引入了mutex,mutex主要用于替代pin.由于Mutex通常在被保护对象内部,这样mutex的数量就多了很多,争用就更少。缺点是如果出现问题,将没有足够的诊断信息。这不是Oracle不愿意提供,而是根本就没办法提供。
10.latch的可共享性。
我们都知道,cbc latch是可共享的,但是看下面的例子:
SQL> create table t1 (x int);
Table created.
SQL> insert into t1 values(1);
1 row created.
SQL> commit;
开两个session,分别运行下面的代码,我们还是会看到latch: cache buffers chains的等待事件。cbc latch不是共享的吗?
declare
i int;
a int;
begin
for i in 1..1000000 loop
select x into a from t1;
end loop;
end;
/
SQL> select sid,event from v$session where wait_class!='Idle';
SID EVENT
---------- ----------------------------------------------------------------
31 latch: cache buffers chains
47 cursor: pin S
57 SQL*Net message to client
现在我们在表上面建一个unique index
SQL> SQL> create unique index idx1 on t1(x);
Index created.
然后运行同样的代码,cbc latch的等待消失了。
结论:大多数情况下,都是以独占模式获取的可共享的cbc latch,只有当表上有unique index的时候,访问索引的root节点,到branch节点,到叶子节点,都是以共享模式获取可共享的cbc latch.
- 关于Oracle中的latch和mutex
- 关于oracle mutex和latch的问题
- oracle中的Latch和Lock
- oracle中的Latch和Lock
- ORACLE parent latch和children latch
- 深入理解Oracle中的latch
- 关于.net中的mutex
- [Oracle] 谈谈Lock和Latch
- Oracle Latch
- 关于latch
- oracle latch 和 lock的差异
- Oracle优化03-Latch和等待
- Oracle Latch及latch矛盾
- Oracle Latch及latch冲突
- 2.latch之oracle latch
- Linux中的spinlock和mutex
- Linux中的spinlock和mutex
- Linux中的spinlock和mutex
- 一入python深似海--list
- 深入理解指针函数与函数指针
- UVa 575 Skew Binary 歪斜二进制
- 32位WIN7直接破解,上6G内存,已测试,6G全为可用内存
- hibernate原理使用详解y
- 关于Oracle中的latch和mutex
- 在MFC中添加用户自定义消息
- NGUI的UISprite动态染色的一种解决方案
- 使用HTML HELP WORKSHOP制作CHM帮助文档
- 图:广度优先搜索(Breadth_First Search)
- 精图规范1.0----7 坐标系, 变换和单位Coordinate Systems, Transformations and Units
- 黑马程序员_网络电视用中国电信路由器不能联网的问题
- cocos2dx-3.0(12)------33场景切换效果
- activema 为什么会丢包呢?