关于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 Core,Vage,Andrey Nikolaev的研究成果。



0 0
原创粉丝点击