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