Mysql锁 - 类型概括(持续完善)

环境:mysql5.6,InnoDB引擎,RR隔离级别

InnoDB存储引擎支持多粒度锁定,即表级锁和行级锁“同时”存在。且行级锁的数量不影响开销,因为使用的是位图标记的算法。参考InnoDB的逻辑存储结构学习.

介绍mysql锁之前,先来简单了解一下宏观概念上的锁的类型:

  • 互斥锁:
  • 独占锁:
  • 乐观锁:
  • 悲观锁:同独占锁。
  • 排它锁:
  • 共享锁:有时称读锁。
  • 自旋锁:

mysql锁大致分为以下几类:

  • 表级锁(锁表)
  • 页级锁(锁页)
  • 行级锁(锁行)
  • 意向锁(表锁和行锁的兼容)
  • 插入意向锁(insert插入数据时专有锁)
  • 元数据锁(基础锁)
  • 自增锁(主键自增)

在实际使用中,还细分为具体的【排它型X锁】和【共享型S锁】,对于行级锁,还有更细致的类型:R锁、GAP锁和Next-key锁。


表级锁

比如MyISAM只有表级锁。表锁分【排它型X锁】和【共享型S锁】,MyISAM中称为:表共享锁和表独占写锁。

表锁性能差,不利于并发更新记录,因此innodb引擎支持的行锁可以大大提高并发,但引入了死锁的问题:不同事务分别持有某一记录的锁不释放,同时申请对方持有的行锁。


行级锁

对一个记录加锁的两种类型:

  • 排它锁X:
    • select … from … where … for update
    • 同一时刻,只能有一个事务申请到X锁,其他的不管是读还是写,都需要排队,即堵塞其他的事务对X锁和S锁的申请。
  • 共享锁S:
    • select … from … where … lock in share mode
    • 允许多个事务并发的申请S锁不堵塞,即可以并发读,不冲突。

innodb行锁的机制较为复杂,无论是X锁还是S锁,根据不同的需求又衍生出作用丰富的锁:

  • R锁:记录锁
  • Gap锁:间隙锁
  • Next-key锁:简称NK锁,结合R锁和Gap锁,是innodb默认的行锁模式。
>注: >1. 如果没有设置主键,innodb会自动生成隐式的主键(且自增),即聚集索引。 >2. 锁都是加在索引上的,索引是B+树存储结构。

你可能感兴趣的:(mysql)