1.按照粒度划分:
全局锁:锁定数据库表的内容(简单地说就是锁定整个教室,常用于只读存储)
行级锁:锁定每一行的或者多行的数据,行级锁又分为共享锁和排他锁(共享锁
页面锁:锁定该页的数据
表级锁:锁定整张表又包含了表锁和元数据锁,MDL在访问表的时候会自动加上,保证了DML(数据库操作语言)和DDL(数据库定义语言)的一致性
2.按照锁的兼容性划分
也就是按照读写划分:
共享锁(S):能共享所里面的数据,允许事务的读取,但不能修改
排他锁(X):不能共享锁里面的数据,也不能进行读写
这里可以衍生出意向锁概念,就是当我们要在所内容添上X锁时,表级会自动添加的意向排他锁(IX),目的为了快速判断表级锁冲突
比如有人想给整个表加S锁时,发现表上有IX锁,就知道有行被锁住了,无需逐行检查。
3.按照算法划分:
记录锁:锁定索引记录本身。
示例:执行UPDATE users SET name = '张三' WHERE id = 5时,如果 id=5 的记录存在且 id 是主键或唯一索引,InnoDB 会对 id=5 这一行记录加记录锁,防止其他事务修改或删除该行。
间隙锁:锁定索引记录之间的间隙,不包含记录本身,目的是防止幻读。
示例:假设表 users 中 id 值有 1, 3, 7,执行SELECT * FROM users WHERE id BETWEEN 3 AND 7 FOR UPDATE时,InnoDB 会对 (3, 7) 这个区间加间隙锁,阻止其他事务插入 id=4,5,6 的新记录,但不会锁定 id=3 和 id=7 的现有记录。
临建锁:介于记录锁和间隙锁之间,它锁定的是一个左开右闭区间。
示例:执行SELECT * FROM users WHERE id > 5 FOR UPDATE时,如果 id=5 的记录存在,InnoDB 会对 (5, +∞) 这个区间加临建锁,既锁定 id=5 之后的间隙,也锁定第一个遇到的记录(如果存在)。例如,如果表中有 id=7 的记录,则 (5, 7] 区间被锁定。