每日八股day6

📅 2026/7/30 8:27:55
每日八股day6
### 本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写如有错误纯属本人实力不佳欢迎各位大佬阅读指正 ###1.InnoDB 有哪些锁行锁锁一行数据锁索引记录粒度最小并发最高只锁满足条件的某一行基于索引实现没索引会退化成表锁分两种共享锁读锁共享兼容排他锁写锁独占表锁直接锁整张表粒度大并发差一般不用手动加锁在InnoDB正常更新不会用表锁只有没命中索引时行锁才会降级为表锁。意向锁表级别的锁用来表示“表里有人准备加行锁”意向共享锁准备给行加S锁意向排他锁准备给行加X锁提高表锁与行锁冲突判断效率事务想加表锁时不用逐行检查没有行锁只要看有没有意向锁意向锁之间互不冲突之和表锁冲突。2.行锁什么时候变表锁InnoDB的行锁是基于索引实习的一旦没有索引索引失效全表扫描无法定位到具体行行锁就会退化为表锁。3.记录锁、间隙锁、临键锁 分别是什么记录锁锁某一行索引记录只锁单行不锁前后间隙防止其他事务修改/删除这一行。间隙锁锁索引之间的空隙不锁记录本身防止其他事务在这个区间插入数据解决幻读但是只能在可重复读级别下生效。临键锁记录锁间隙锁合在一起即锁记录本身又锁前面的间隙是InooDB在可重复读级别下默认的行锁算法主要解决幻读问题追问临建锁如何解决的幻读临键锁是 记录锁间隙锁不仅锁住已经存在的数据行还锁住索引之间的空隙让别的事务插不进来。临键锁主要是通过锁定索引记录索引间隙禁止其他事务在锁定的范围内插入数据从根本上杜绝了幻读产生的条件。4.什么是死锁产生条件、怎么排查和避免死锁死锁是两个或多个事务在执行过程中互相持有对方所需要的锁并且都不释放自己的锁导致批次无限阻塞这就是死锁。产生条件互斥条件锁同一时间只被一个事务持有请求与保持条件事务已经持有一把锁有去请求别的锁且不释放已有锁不可剥夺条件一个事务持有的锁只能自己释放不能被其他事务强行剥夺循环等待条件多个事务形成一个环形等待链互相等待对方的锁怎么排查查看MySQL死锁日志查看慢查询业务逻辑找出顺序不一致的更新语句分析是否存在长事务大事务未提交事务如何避免死锁固定资源获取顺序所有事物都按相同的顺序更新表/行。经理使用小事务短事务避免长事务持有锁太久减少冲突概率。合理加索引避免行锁变表锁降低锁粒度减少冲突。操作同行数据时加锁数据顺序一致。避免手动长事务避免在事务中做无关操作事务不做网络请求复杂计算。适当降低隔离级别减少间隙锁使用降低死锁概率。设置锁等待超时