对latch的一点理解

我们在一些书藉和电子文档对latch的介绍,一般的解释都是翻译过来的,缺乏本地化的理解介绍.

轻量级的内存保护机制,栓(闩)锁等,各种解释,让人很难有直观,透彻的理解.

我觉得,如果把对表的lock的理解与对latch的理解联系起来的话,就很容易了.

为了解决并发冲突,Oracle通过lock来对表进行并发控制,但区别于SQL Server等数据库很重要的一点就是:
Oracle读取数据(Select)时不锁表,通过一致性读机制来解决这个问题.这是它领先于其它数据库非常关键的一点.

上面说了表的数据,那么,对于内存中的数据,怎么来解决并发控制呢?

由于SGA中,根据不同的用途,内存分成了很多单元,最重要的就是shared pool和buffer cache,这些数据是以链表的方式来存储的.
想象一下,如果会话A正在读SQL Area中的某条SQL语句,会话B同时正在更新这条SQL语句,如果没有控制这种并发操作,会有什么样的结果呢?

为了对内存的分配,以及读取内存中的数据进行并发控制,Oracle引入了latch这个东西,不同的latch管理不同的内存单元.
需要访问内存中的数据,会话就需要申请获得一个latch,锁定相应的内存单元,避免其它会话的修改,使用完后释放,这个过程非常短暂.
但是,如果并发访问很多,就会出现等待,Oracle有一套规则规定了等待的方式.

可以把latch想象成药房的发药员,你要什么药,就给发药员说,如果这时有很多人来拿药,就需要排队
送药入库的人来了,要放在什么位置,也要给药库管理的人说,他给你分配一个空间--柜子,来存储.

如果中药房只有一个发药的人,或者只有一个药库管理员,那么,需要拿药的人或入库的人都得在那里排队等待.

拿共享池空间的分配来说,SQL语句或者数据字典要存放到内存中,需要申请空间,空间的分配就由Shared Pool latch来进行
8i以前,只有一个Shared Pool latch,如果SQL的绑定做得不好,就有大量的SQL需要进出内存,那么这个串行的锁,争用就比较明显.
9i及以后,Shared Pool latch增加到了7个,争用可以得到一定程度的缓解.

注意:latch不同于表的lock,latch在读取的时候也要锁定相应的内存,因为这里没有一致性读的概念,没有类似回滚段的内存空间.
以上是对latch的一点浅薄理解,更深入的知识可以参考相关书籍.如果有不同的理解,欢迎一起交流讨论.

原文地址:https://www.cnblogs.com/zyk/p/439593.html