
表级锁,行级锁,页级锁
MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定、页级锁定。
1.1 表级锁
表级别的锁定是 MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。
当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣。
使用表级锁定的主要是 MyISAM,MEMORY,CSV 等一些非事务性存储引擎。
1.2 行级锁
行级锁定最大的特点就是锁定对象的颗粒度很小,由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。
由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
使用行级锁定的主要是 InnoDB 存储引擎。
1.3 页级锁
页级锁定是 MySQL 中比较独特的一种锁定级别。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。
使用页级锁定的主要是 BerkeleyDB 存储引擎。
1.4 总结
总的来说,MySQL 这 3 种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
共享锁,排他锁

加锁模式
记录锁
- 约束条件必须为主键索引或唯一索引,否则会变为临键锁
- 匹配条件必须为精确匹配,不能是>,<,否则会变为临键锁
- 记录锁是锁住索引记录,不是数据记录
- 如果要加锁列没有索引,进行全表记录加锁
- 记录锁也是排他锁,阻塞其他事务的插入,删除,更新
间隙锁
- 间隙锁锁住的是一个开区间
- 间隙锁 是 InnoDB 在 RR(可重复读)隔离级别下为了解决 幻读问题 时引入的锁机制。间隙锁是InnoDB 中行锁的一种。
临键锁
- 临键锁是记录锁和间隙锁的结合
- 通过临建锁可以解决幻读的问题。每个数据行上的非唯一索引列(该索引里面的值允许重复)上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段 左开右闭 区间的数据。
- InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。
记录,间隙,临键锁总结
- InnoDB 中的 行锁 的实现依赖于 索引,一旦某个加锁操作没有使用到索引,那么该锁就会退化为表锁。
- 记录锁 存在于包括 主键索引 在内的 唯一索引 中,锁定单条索引记录。
- 间隙锁 存在于 非唯一索引 中,锁定开区间范围内的一段间隔,它是基于 临键锁 实现的。
- 临键锁 存在于 非唯一索引 中,该类型的每条记录的索引上都存在这种锁,它是 一种特殊的间隙锁,锁定一段 左开右闭 的索引区间。
意向锁
先说个人理解,意向锁是innoDB自动加的,他像是一个“内有恶犬”的通知,当需要更新表时,我们会先看意向锁,通过意向锁获取表中行记录的共享和排他锁的加锁情况,这样不用进行表级遍历就可以知道内部的情况,大大提高效率。
特点:
- 意向共享锁(IS)和 意向排他锁(IX)都是 表锁。
- 意向锁是一种 不与行级锁冲突的表级锁,这一点非常重要。
- 意向锁是 InnoDB 自动加的, 不需用户干预。
- 意向锁是在 InnoDB 下存在的内部锁,对于MyISAM 而言没有意向锁之说。

插入意向锁
插入意向锁用来解决并发插入的问题

总结
- InnoDB 在 RR 的事务隔离级别下,使用插入意向锁来控制和解决并发插入。
- 插入意向锁是 一种特殊的间隙锁。
- 插入意向锁在锁定区间相同但记录行本身不冲突的情况下互不排斥。’
乐观锁和悲观锁
同java一致,可以移步一文了解Java锁机制


