• 按照粒度分,MySQL锁可以分为全局锁、表级锁、行锁
  • 全局锁会锁住左右表,整个库无法修改
  • 表级锁分为表锁(数据锁)和元数据锁
  • 行锁会锁住数据行,分为共享锁和独占锁

    全局锁

  • FTWRL(Flush tables with read lock)

  • 此命令使整个库处于只读状态
  • 主要用途是保证备份的一致性
  • 不要随意使用,杀伤性极大,要在备库使用

    表锁(数据锁)

  • 命令:lock tables XXX read/write

  • 表锁是非常重的锁,在InnoDB中使用很少

    元数据锁(matadata lock)

  • 元数据指的是表的结构、字段、数据类型、索引等

  • 事务访问数据时,会自动给表加MDL读锁
  • 事务修改元数据时,会自动给表加MDL写锁

    行锁

  • 行锁也有两种类型,有很多种叫法:

    • 读锁/写锁
    • 共享锁/排它锁
    • 共享锁/独占锁
    • S锁/X锁
  • S锁不是不让读,而是自己要读,不让别人写
  • X锁不只是不让写,而是自己要写,不让别人读写
  • 只有S锁和S锁之间可以兼容,其他均不兼容

image.png

总结

锁是MySQL高效执行事务的必备基础
锁会引发很多的性能问题,可能造成等待和死锁
锁还会引发很多的功能问题,如脏读和不可重复读等