什么是latch:
锁是数据库系统区别与文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。Innodb存储引擎在行级别上对表数据上锁,这固然不错。但是Innodb也会在多个地方使用锁,从而允许多种不同资源提供并发访问。例如,操作缓冲池汇总的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入,这就是latch锁。
latch与lock的区别
latch一般称为闩锁(轻量级别的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在Innodb存储引擎中,latch又可以分为mutex(互斥量)和RW-Lock(读写锁)。
而lock对象是事务,用来锁定的是数据库中的对象,如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,是有死锁机制的。
同过show engine innodb mutex 进行查看latch
name列显示的是latch的信息以及源码所在的位置(行数)。
latch的分类
分为:mutex:互斥量;有时候有些资源需要共享和并发,但是又不是分频繁,所以向操作系统申请一个mutex,mutex都是排他的。
RW-LATCH : 读写锁
latch的理解:
一个例子:
当我们在执行select 时,数据是缓存在buffer pool中的,多个线程并发访问或者修改这个数据必然需要一个并发控制机制,这个就是latch
数据库要访问的数据必须先存在缓存中,而缓存一般比磁盘空间要小,数据缓冲使用hash表来记录数据页是否在内存中。在MySQL中对应的RW-Latch在errlog中说的很清楚,该RW-Latch是在buf0sea.cc的658行创建的RW-Latch。
看errorlog 的压测示例:
根据日志我们可以分析到线程140140355766016要对记录加一个x锁,但是等待线程0x4c407b8线程的RW-Latch的释放。
latch争用过程
1)a 以x访问链表
2)b 排队等待x解锁 占了cpu,但是cpu发现你在等待,所以cpu将b踢出
3)锁链的时间,就是找数据的时间。
4)b知道很a快所以,b不去排队,这是后去spin 也就是空转cpu,然后再去看一下内存数据结构,a是否已解锁
5)b转了一圈后,在bspin的时间段的时间中,c进来了,连续多次的spin后, 产生了os waits
6)操作系统将b从cpu中踢出
latch锁特点:
1.不排队
2.spin
3.os waits
4.cpu繁忙
mutex: