需要注意的是DML读锁保证的是表结构不能修改,与表数据无关,可以对数据进行操作,与读锁有区别。MDL写锁保证的是表结构不能修改,并且数据也不能读取。 c. 页锁:页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。目前只有BDB引擎支持页级锁。 d. 行锁:行锁是粒度最小、发生锁冲突概率最低、并发度最高的锁,但是加锁慢、开销大,容易发生死锁现象。目前只有innodb引擎支持行锁,行锁通过锁索引来实现,当无法通过索引来加锁时,行锁会转成表锁。
记录锁、间隙锁和临键锁都属于行锁。
4. 按模式分:
a. 乐观锁:乐观锁假设数据不会发生冲突,只有在数据提交更新时才会检测是否冲突,如果冲突了才会返回错误信息。适用于读多写少的场景。 b. 悲观锁:悲观锁具有强烈的独占和排他特性,适用于并发量不大、写入比较频繁、数据一致性比较高的场景。Mysql中的共享锁和排他锁都属于悲观锁。
5.按算法分
a. 记录锁:精准命中唯一索引或主键索引时加记录锁,避免不可重复读和脏读问题。 b. 间隙锁:普通索引、联合索引命中,或者唯一索引命中多行数据时加锁,避免幻读问题。 c. 临键锁:记录锁和间隙锁的组合,索引命中多行数据时加锁,避免脏读、幻读和不可重复读三个问题。