闩锁和锁有什么区别

分类:编程技术 时间:2024-02-20 15:31 浏览:0 评论:0
0
本文介绍了“Latch和Lock有什么区别”的相关知识。在实际案例操作过程中,很多人都会遇到这样的困境。接下来就让小编带领大家学习一下如何处理这些情况。酒吧!我希望你能仔细阅读并学到一些东西!

本文向您讲解OracleLatch机制。 Latch,金山词霸翻译过来就是门闩,插销,专业术语叫锁。刚开始接触收银机的时候,我不太明白为什么不写Lock。不都是锁吗?这只是一个不同的翻译。经过研究,我发现两者之间有很大的区别。

Oracle中的锁信息是数据块的一部分,数据块是物理的,逻辑上不属于某个表或行。 Latch是Oracle提供的轻量级锁资源。用于快速锁定资源短时间内防止多个并发进程同时修改和访问共享资源。它只在内存中起作用。我们可以不准确的说,对内存中资源的锁称为latch,对数据库对象(表、索引等)的锁称为Lock。例如,如果要读取数据缓存中的一个块,我们将获得该块的latch。这个过程称为pin。另一个进程恰好修改了这个块,并且它也想固定这个块。这个时候就必须等待了。该进程只能在释放闩锁后锁定闩锁,然后对其进行修改。如果多个进程同时请求,它们之间就会发生竞争。没有排队机制。一旦前一个进程释放了闩锁,后面的进程就会蜂拥而至。没有先来先服务的概念。 ,这和Lock有着本质的区别。这一切发生得很快,因为Latch的特点是速度快且寿命短。当然,这只是一个大概的过程,具体的细节稍后再说

先来看看Latch和Lock的区别,

1、Latch是一种提供内存数据结构互斥访问的机制,而Lock则采用不同的模式来检索共享资源对象。各种模式之间存在兼容或排斥。从这个角度来看,Latch的访问,包括查询,也是互斥的。在任何时候,只有一个进程可以固定某一块内存。幸运的是,这个过程相当短。否则,系统性能将得不到保证。从9I开始,允许多个进程同时查询同一个内存块,但性能却没有想象中的那么好。

2、Latch只作用于内存,只能被当前实例访问,而Lock作用于数据库对象。 RAC系统中的实例之间允许进行锁检测和访问

3.锁存器被占用并立即释放。 Lock的释放需要等到事务正确结束,需要的时间长短由事务的大小决定

4.Latch没有入队,但是Lock入队

< p> 5.Latch中没有死锁,但是Lock中有(死锁在Oracle中很少见)

看下面的例子,你就会感受到Latch的存在

SQL> 创建表 MYTEST AS SELECT OBJECT_NAME FROM USER_OBJECTS WHERE ROWNUM <= 4;
表已创建
SQL> SET TIMING ON
SQL>
DECLARE lv_name VARCHAR2(25) := '';
BEGIN
FOR i IN 1..100000 LOOP
SELECT OBJECT_NAME INTO lv_name FROM MYTEST WHERE ROWNUM = 1;
结束循环;
结束;
/
​PL/SQL 过程成功完成
​执行时间为 3.359 秒

​这个过程不断地访问表上的同一个数据块,他首先将该数据块物理读入数据缓冲区,然后在内存中不断获取该块的latch。现在只有一个进程,并且运行良好。 10万次需要3秒多,但是当我拉出4个windows并发运行这条语句时就出现问题了。多个进程 PIN 相同的数据块。每个过程大约需要15秒,并且可以看到它们一一结束。当最后只剩下一个时,转眼就过去了。由于没有人与他竞争,所以这个实验出现了Latch竞争的现象。我对9I提出的Latch可以共享的质疑表示怀疑。

产生Latch的主要原因有:

1、过多的会话访问同一个数据块,导致热块的产生。

2. 共享池过多。许多sql语句需要软解析并且不需要绑定变量使用

现在我们看一下进程获取Latch的详细过程。任何时候,只有一个进程可以访问内存中的某一块(9I共享提出的Latch(我不想考虑),如果该进程因为其他进程正在占用该块而无法获取Latch,就会使CPU自旋一次,时间很短,自旋结束后会继续获取,如果失败,还会自旋,直到自旋次数达到阈值限制时(这是通过隐式参数指定的) _spin_count),进程会停止自旋,进行短暂的休眠,休眠后会继续之前的动作,直到获得该块上的Latch。进程的休眠时间也有一个算法,会随着自旋次数增加,以厘秒为单位,如1,1,2,2,4,4,8,8...sleep的阈值限制由隐式参数_max_exponential_sleep控制,默认为2秒。如果当前进程已经占用了其他Latch,那么它的休眠时间不会太长(太长会导致其他进程等待Latch)。此时的最大休眠时间由隐式参数_max_sleep_holding_latch决定,默认为4厘秒。这种限时睡眠也称为短期等待。另一种情况是长时间等待latch(Latch Wait Postin.g),此时等待进程请求Latch失败而进入睡眠。它会向latch等待列表(Latch Wait List)推送一个信号,表明请求获取Latch。当占用进程释放Latch时,会检查Latch等待列表。 ,将信号传递给请求进程并激活休眠进程。 Latch Wait List是在SGA区域维护的进程列表。它还需要Latch来保证其正常运行。默认情况下,共享池闩锁和库高速缓存闩锁使用此机制。如果设置了隐式参数_latch_wait_posting到2,那么所有的锁存器都采用这种等待方式。这种方法可以比较准确地唤醒等待进程,但是维护Latch Wait List需要系统资源,并且对Latch Wait List上的Latch的竞争也可能会造成瓶颈。

如果一个进程长时间请求、轮换或者休眠一个Latch,它会通知PMON进程查看占用该Latch的进程是否意外终止或者死亡。如果是,PMON将清除并释放占用的Latch。资源。

现在大家就可以明白获取Latch的流程了,request-SPIN-sleep-request-SPIN-sleep。 。 。占领,这里有人会问为什么需要SPIN,为什么不直接睡觉等待呢?这里我们需要了解一下睡眠是什么意思。意味着暂时放弃CPU,进行上下文切换(context switch),这样CPU在当前进程运行时需要保存一些信息。状态信息,比如栈、信号量等数据结构,然后引入后续进程的状态信息,处理完成后切换回原来的进程状态。如果这个进程在高事务、高并发的进程处理系统中频繁出现,那将是非常昂贵的资源消耗,所以他选择了spin,让进程继续占用CPU,运行一些空指令,然后继续请求并继续旋转,直到达到 _spin_count 值。这时CPU就会被让出,它会短暂休眠,然后继续刚才的动作,Oracle软件就是这样设计的。是世界大师的杰作。这自然有其自身的原因。我不会再浪费任何言语了。

没有办法避免系统等待Latch,因为这是Oracle的运行机制。当您看到较高的 Latch get 时,并不意味着您的系统需要调整。有时很 后面只有很短的等待时间他获得的价值很高。我们调整的对象应该以消耗的时间来划分,而不是看到很高的获取值。当然,get值比其他等待时间异常高出几十倍。情况再糟糕一万倍的时候我们还是要关心,Oracle对Latch的等待有很多,主要包括共享池、库缓存、缓存缓冲链和缓冲区忙等待。每次调整几乎都要好几页,以后慢慢完成。

这里介绍了“Latch和Lock有什么区别”。感谢您的阅读。如果您想了解更多行业资讯,可以关注网站,小编将为大家输出更多优质实用文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 闩锁和锁有什么区别

用户评论