环境:mysql5.6,InnoDB引擎,RR隔离级别
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+树存储结构。