前言
什么是mysql锁的算法,它有哪些分类,每个分类具体的特性有哪些,经过几天的百度学习,有了初步了解,下面总结一下自己的学习心得,以供他人参考。
一、什么是mysql锁的算法?
1.锁的分类
mysql从锁的机制上划分,可以分为乐观锁和悲观锁,悲观锁从类别上划分,又可以分为共享锁(S锁或读锁)和排它锁(X锁或写锁)。2.mysql默认的隔离级别
mysql默认的隔离级别是RR,实现RR隔离级别有两种方式,一种是通过MVCC快照实现;另一种是锁的机制,这种锁一定是悲观锁。
3.算法分类
我们在手动开启悲观锁的时候,mysql会根据影响的数据范围,开启不同的锁的算法,由此形成了锁算法的分类,大致分为三类:行锁、间隙锁和临键锁(还有其他的页级锁不在本次讨论范围:例如意向锁、自增锁)。
二、行锁、间隙锁和临键锁
1.行锁(Record Locks)
顾名思义,就是只会锁住某一行的数据,行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。有可能会出现死锁的情况。产生行锁一般是等值查询,且作用于唯一索引或连续的普通索引(普通索引列的值没有间隔)/font>
2.间隙锁(Gap Locks)
间隙锁是封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。
可能产生间隙锁的条件:
1.使用普通索引锁定;
2.使用多列唯一索引;
3.使用唯一索引锁定多行记录。
间隙锁可以通过参数innodb_locks_unsafe_for_binlog开闭
3.临键锁(Next-key Locks)
临键锁是行锁和间隙锁的组合,它的封锁范围,既包含索引记录(行锁),又包含索引区间(间隙锁)。无论是唯一索引或是普通索引都有可能产生临键锁。RR隔离级别,默认是临键锁,临键锁根据不同的作用范围,可以转换为行锁和间隙锁,在RC隔离级别下,它和间隙锁会失效。