作者小头像 Lv.7
9472 成长值

个人介绍

柠檬味拥抱。全网粉丝20w+,欢迎关注。

感兴趣或擅长的领域

鲲鹏、昇腾、鸿蒙、人工智能、IoT
个人勋章
  • 万人瞩目
  • 活跃之星
成长雷达
9320
132
0
0
20

个人资料

个人介绍

柠檬味拥抱。全网粉丝20w+,欢迎关注。

感兴趣或擅长的领域

鲲鹏、昇腾、鸿蒙、人工智能、IoT

达成规则

发布时间 2026/09/04 19:54:50 最后回复 柠檬🍋 2026/09/06 23:41:30 版块 数据库
30 3 0
发布时间 2026/09/03 21:53:05 最后回复 柠檬🍋 2026/09/05 11:19:17 版块 数据库
28 2 0
他的回复:
MySQL InnoDB 存储引擎默认的事务隔离级别是 REPEATABLE READ(可重复读)。它主要通过 MVCC(Multi-Version Concurrency Control,多版本并发控制)+ Undo Log + Read View 来实现。1. 四种隔离级别从低到高通常是:隔离级别脏读不可重复读幻读READ UNCOMMITTED✅✅✅READ COMMITTED❌✅✅REPEATABLE READ❌❌理论上可能,InnoDB 通过间隙锁等机制处理SERIALIZABLE❌❌❌InnoDB 默认采用 REPEATABLE READ。2. MVCC 是怎么工作的?可以简单理解成:数据库不会只保存一份数据,而是通过 Undo Log 保存数据的历史版本,让不同事务可以读取自己应该看到的那个版本。例如数据库最初:id = 1name = 张三age = 20事务 A 开始后,事务 B 执行:UPDATE user SET age = 21 WHERE id = 1;InnoDB 不会简单地把 20 永久覆盖掉,而是:当前版本:age = 21Undo Log:age = 20于是数据库实际上形成了一个版本链:最新版本 age=21 ↓历史版本 age=20 ↓更早版本 ...事务 A 如果需要读取旧版本,就可以沿着 Undo Log 找到自己应该看到的数据。3. Read View 是关键MVCC 中还有一个非常重要的东西:Read View(读视图)。事务进行一致性读时,会创建 Read View,用它判断:某个数据版本对当前事务来说,到底可不可见?可以简单理解为:事务 A │ ├── 创建 Read View │ ↓读取数据 │ ├── 最新版本对我可见? │ ↓ 否 │ └── 沿 Undo Log 找历史版本 ↓ 找到可见版本因此,即使其他事务已经修改了数据,事务 A 仍然可能读取到自己事务开始时所看到的版本。4. 为什么叫“可重复读”?例如事务 A:BEGIN;SELECT age FROM user WHERE id = 1;得到:20此时事务 B 修改:UPDATE user SET age = 21 WHERE id = 1;COMMIT;事务 A 再次执行:SELECT age FROM user WHERE id = 1;在 InnoDB 的 RR 隔离级别下,一致性读仍然可以得到:20因为事务 A 的 Read View 会让它继续看到符合可见性规则的旧版本,而不是直接读取事务 B 提交后的新版本。5. MVCC 解决的核心问题可以把 InnoDB 的 MVCC 简化成: InnoDB │ ┌────────────┴────────────┐ ↓ ↓ 当前数据 Undo Log │ │ 最新版本 ←────────────── 历史版本 │ ↓ Read View │ ↓ 判断哪个版本可见 │ ↓ 返回给事务这样多个事务就可以:事务 A:读取旧版本事务 B:修改并读取新版本事务 C:读取自己的可见版本彼此之间不需要因为普通查询而完全阻塞。6. 一个容易混淆的点MVCC 并不等于“完全不会出现幻读”。InnoDB 的 RR 隔离级别主要依靠:MVCC:解决普通 SELECT 的一致性读问题Next-Key Lock(临键锁)Gap Lock(间隙锁)共同处理并发问题。其中:SELECT ...这种普通一致性读主要依赖 MVCC。而:SELECT ... FOR UPDATE属于当前读(Current Read),读取的是最新版本,并且可能通过锁机制防止其他事务插入满足条件的新记录。所以可以记成一句面试答案:MySQL InnoDB 默认隔离级别是 REPEATABLE READ。InnoDB 通过 MVCC 实现一致性读,利用 Undo Log 保存数据历史版本,并通过 Read View 判断事务可见的数据版本;对于当前读,则结合行锁、间隙锁和 Next-Key Lock 等机制控制并发,从而实现较强的事务隔离。
发布时间 2026/09/03 21:52:31 最后回复 柠檬🍋 2026/09/04 14:12:00 版块 数据库
11 2 0
发布时间 2026/08/30 22:26:39 最后回复 柠檬🍋 2026/09/02 14:12:12 版块 数据库
49 3 0
发布时间 2026/08/30 22:26:10 最后回复 柠檬🍋 2026/09/01 12:33:17 版块 数据库
16 2 0
他的回复:
数据库迁移要保证数据的一致性和完整性,核心是做到“迁移前可验证、迁移中可控制、迁移后可校验、异常时可回滚”。常见做法包括:迁移前备份对源数据库进行完整备份或增量备份。保留恢复点,确保迁移失败时可以快速恢复。对关键表提前进行数据量、主键、唯一键等统计。保证迁移过程的原子性对必须整体成功的操作使用事务。将数据迁移拆成多个可控批次,避免单个超大事务导致锁表或日志膨胀。对跨数据库迁移,可以使用双写、CDC(Change Data Capture)等机制降低数据丢失风险。处理迁移期间的数据变更停止业务写入是最简单可靠的方式,但通常会造成停机。更常见的是采用“全量迁移 + 增量同步 + 最终切换”:先迁移历史数据;再同步迁移期间产生的新数据;等源库和目标库基本一致后进行业务切换。保持数据约束正确迁移主键、外键、唯一约束、非空约束等。注意字段类型、精度、字符集、时区等差异。对自增 ID、枚举值、NULL 值等特殊数据进行专门处理。迁移后进行数据校验对比源库和目标库的记录数。对关键字段进行 Hash/Checksum 校验。检查主键是否重复、外键是否存在孤儿记录。对金额、订单数量等核心业务指标进行业务级校验。设计回滚方案迁移脚本应该具备可逆性,或者至少提前准备恢复方案。正式切换前保留旧数据库,不要立即删除。出现严重异常时可以快速将流量切回旧数据库。做好监控和审计记录迁移开始时间、批次、成功数量、失败数量等信息。监控数据库 CPU、内存、锁、连接数、复制延迟等指标。对失败数据单独记录,支持重试,而不是简单跳过。典型的生产迁移流程可以概括为:备份 → 全量迁移 → 增量同步 → 数据校验 → 灰度切换 → 实时监控 → 最终切换 → 保留旧库 → 确认无误后清理其中最关键的是:不要只验证“数据有没有迁过去”,还要验证“数据是否完整、关系是否正确、业务结果是否一致”,并且必须提前准备回滚方案。
发布时间 2026/08/29 22:54:14 最后回复 柠檬🍋 2026/08/30 14:36:58 版块 数据库
33 3 0