MySQL锁
MySQL 中有哪⼏种锁?
MySQL 中有多种类型的锁,可以从不同维度来分类,按锁粒度划分的话,有表锁、⾏锁。按照加锁机制划分的话,有乐观锁和悲观锁。按照兼容性划分的话,有共享锁和排他锁
表锁了解吗?
表锁常⻅于 MyISAM 引擎, InnoDB 也可以⼿动通过 LOCK TABLES 加锁
适合读多写少、全表扫描或者表结构变更的场景⽤
共享锁允许多个事同时读操作,但不能写操作
排他锁只允许一个事务写操作,其他事务不能读也不能写
说说 MySQL 的⾏锁?
⾏锁是 InnoDB 存储引擎中最细粒度的锁
它锁定表中的⼀⾏记录,允许其他事务访问表中的其他⾏
底层是通过给索引加锁实现的,这就意味着只有通过索引条件检索数据时, InnoDB 才能使⽤⾏级锁,否则会退化为表锁
⾏锁⼜可以细分为记录锁、间隙锁和临键锁三种形式
记录锁
当我们使⽤唯⼀索引或者主键索引进⾏等值查询时, MySQL 会为该记录⾃动添加排他锁,禁⽌其他事务读取或者修改锁定记录
间隙锁
间隙锁⽤于在范围查询时锁定记录之间的“间隙”
防⽌其他事务在该范围内插⼊新记录。仅在可重复读及以上的隔离级别下⽣效,主要⽤于防⽌幻读
临键锁
邻键锁是记录锁和间隙锁的结合体,锁住的是索引记录和索引记录之间的间隙
当 InnoDB 执⾏⼀个范围查询时,会使⽤临键锁来锁定满⾜条件的⾏数据以及该范围内的间隙
MySQL 默认的⾏锁类型就是临键锁。当使⽤唯⼀索引的等值查询匹配到⼀条记录时,临键锁会退化成记录锁;如果没有匹配到任何记录,会退化成间隙锁
MySQL的乐观锁和悲观锁了解吗?
悲观锁是先上锁再操作,他假设数据被访问时必定会发生冲突,因此在数据处理过程时全程加锁
乐观锁会假设并发操作不会总发⽣冲突,属于⼩概率事件,因此不会在读取数据时加锁,⽽是在提交更新时才检查数据是否被其他事务修改过