RSS
菜单
社区成员个人主页
阿成员
DEV CN / 成员主页

阿青 · 社区话题账号

查看阿青 · 社区话题账号发布的技术文章、关注圈子与公开讨论。

0技术文章4关注圈子465圈内发布1关注者
COMMUNITY POSTS

交流圈发布内容

作者在不同技术圈子中的观点与讨论

1
# MySQL

MySQL 死锁怎么产生?怎么解决?

死锁:两个事务互相持有对方需要的锁且等待。示例:T1 锁行 A 等行 B,T2 锁行 B 等行 A。InnoDB 处理:死锁检测(等待图)自动回滚代价较小的事务(ERROR 1213 Deadlock found),不需人工干预;也支持 innodb_lock_wait_timeout 超时。预防:① 加锁顺序一致(按固定顺序访问多行,如先小 id 后大 id);② 一次尽量锁少行(缩小事务范围);③ 事务尽量短(少持锁);④ 避免大事…

2
# MySQL

MySQL 的锁有哪些类型?

按粒度:表锁(MyISAM 默认、DDL)、行锁(InnoDB 默认,锁索引记录)、页锁;按模式:共享锁 S(读锁,可共存)、排他锁 X(写锁,互斥);行锁细分:记录锁(Record Lock,锁单行)、间隙锁(Gap Lock,锁区间防插入)、Next-Key Lock(记录+间隙,RR 默认,防幻读);意向锁(IS/IX):表级标记,表示事务准备加行锁,用于快速判断表级锁兼容;其他:自增锁(AUTO-INC)、MDL 锁(元数据)。…

3
# MySQL

悲观锁和乐观锁的区别?MySQL 怎么实现?

悲观锁:假设会冲突,操作前先加锁(别人进不来)——SELECT ... FOR UPDATE(行锁/表锁,事务内生效)、LOCK IN SHARE MODE(共享锁)、UPDATE/DELETE 自带;适合写多、冲突频繁场景。乐观锁:假设不冲突,提交时校验版本——版本号(version 字段:UPDATE ... SET v=v+1 WHERE id=? AND version=旧值,影响行数 0 则重试)或时间戳/状态字段;适合读多写…

4
# MySQL

MySQL MVCC 是什么?undo log 版本链怎么工作?

MVCC(Multi-Version Concurrency Control,多版本并发控制):读写不互斥——读操作读快照版本,写操作加锁,通过版本链实现无锁读。实现:每行有隐藏列 trx_id(最近修改事务 ID)、roll_pointer(指向 undo log 版本);undo log 保存旧版本形成版本链;快照(ReadView)由活跃事务列表生成,读时沿版本链找对当前事务可见的版本。Read View 规则:可见版本 trx_…

5
# MySQL

MySQL 幻读怎么解决?Next-Key Lock 是什么?

幻读解决:① 快照读(普通 SELECT):MVCC 版本链保证同一事务读到一致快照(RR 下首次查询生成快照),天然无幻读;② 当前读(SELECT ... FOR UPDATE/LOCK IN SHARE MODE/UPDATE/DELETE):加锁解决——记录锁(行锁)+ 间隙锁(gap lock,锁区间)+ Next-Key Lock(记录锁+左开右闭区间锁,如 (10, 20]),锁住范围防止其他事务在区间插入。注意:RR 下…

6
# MySQL

MySQL 脏读、不可重复读、幻读分别是什么?

脏读:读到其他事务未提交的数据(可能被回滚)——READ UNCOMMITTED 才有;不可重复读:同一事务两次读同一行,值不同(其他事务提交了 UPDATE)——RC 有、RR 解决;幻读:同一事务两次查询同一范围,行数不同(其他事务插入/删除了行)——RR 下 InnoDB 通过 MVCC(快照读)与间隙锁/Next-Key Lock(当前读)解决大部分。区分:不可重复读是改(行内容变化),幻读是增删(行数变化)。验证:开两个会话,…

7
# MySQL

MySQL 的隔离级别有哪几种?默认是什么?

四种(SQL 标准):① READ UNCOMMITTED 读未提交:脏读、不可重复读、幻读都可能;② READ COMMITTED 读已提交:解决脏读(每次查询生成新快照),仍有不可重复读与幻读;③ REPEATABLE READ 可重复读:解决不可重复读(MVCC 快照),MySQL 默认级别,配合间隙锁解决大部分幻读;④ SERIALIZABLE 串行化:全部解决(读写都加锁,性能最差)。MySQL 默认 REPEATABLE R…

8
# MySQL

MySQL 事务的四大特性 ACID 是什么?

A 原子性(Atomicity):事务内操作要么全成功要么全回滚(undo log 实现回滚);C 一致性(Consistency):事务前后数据满足约束(业务规则、完整性),由原子性+隔离性+应用逻辑保证;I 隔离性(Isolation):并发事务互不干扰,由锁与 MVCC 实现(隔离级别控制);D 持久性(Durability):提交后数据不丢失,redo log 保证崩溃恢复。面试要点:能讲清每个特性由什么机制实现(undo lo…

9
# MySQL

MySQL WHERE 和 HAVING 的区别?

WHERE:在分组(GROUP BY)之前对原始行过滤,不能使用聚合函数(COUNT/SUM 等)与聚合别名;HAVING:在分组之后对聚合结果过滤,可以使用聚合函数。执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。优化:能在 WHERE 过滤的不要放 HAVING(提前缩小数据量);HAVING 常用于筛选聚合结果(HAVING COUNT(*) >…

10
# MySQL

MySQL COUNT(*)、COUNT(1)、COUNT(列) 有什么区别?

COUNT(*) :统计行数(含 NULL),InnoDB 下逐行计数(无专门计数器),与 COUNT(1) 等价(都按行数算,不取值);COUNT(1):同样统计行数,效果等同 COUNT(*);COUNT(列):只统计该列非 NULL 的行数(NULL 不计)。性能:三者优化器基本等价(都扫描最小索引),COUNT(列) 若有覆盖索引可能更快;大表 COUNT(*) 仍慢(全表/全索引扫描),优化:计数器表、EXPLAIN 用估算、…