参考文献

lock与latch

  • latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差.在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁).其目的是用来保证线程操作临界资源的正确性,并且通常没有死锁检测的机制.

  • lock的对象是事务,用来锁定的是数据库中的对象,如表,页,行.并且一般lock的对象仅在事务commitrollback后进行释放(不同事务隔离级别释放的时间可能不同).lock在大多数数据库中一样,有死锁机制.

lock与latch不同点

lock latch
对象 事务 线程
保护 数据库内容 内存数据结构
持续时间 整个事务过程 临界资源
模式 行锁,表锁,意向锁 读写锁,互斥量
死锁 通过waits-for graph,time out等机制进行死锁检测 无死锁检测与处理机制,仅通过应用程序加锁的顺序(lock leveling)保证无死锁的情况发生
存在于 Lock Manager的哈希表中 每个数据结构的对象中
  • 对于InnoDB存储引擎中的latch,可以通过SHOW ENGINE INNODB MUTEX进行查看

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> show engine innodb mutex;
    +--------+----------------------------+---------+
    | Type | Name | Status |
    +--------+----------------------------+---------+
    | InnoDB | rwlock: fil0fil.cc:3333 | waits=5 |
    | InnoDB | sum rwlock: buf0buf.cc:788 | waits=9 |
    +--------+----------------------------+---------+
    2 rows in set (0.01 sec)