🧠 一、MVCC 与可重复读(REPEATABLE READ)
项目 | 内容 |
---|---|
MVCC 概念 | 多版本并发控制,事务中读到的是开启事务时的数据快照 |
实现机制 | 依赖 Read View + trx_id + Undo Log 实现版本判断 |
快照读 | 普通 SELECT,使用 MVCC,不加锁,读取历史版本 |
当前读 | SELECT … FOR UPDATE / UPDATE,不使用快照,读取当前版本并加锁 |
默认隔离级别 | MySQL InnoDB 默认 REPEATABLE READ,快照在事务首次读时固定 |
插入型幻读 | 快照读无法解决,InnoDB 通过“间隙锁(Gap Lock)”解决 |
🔬 二、实验验证行为(你亲自操作的)
场景描述 | 验证结果 |
---|---|
快照读能否看到别的事务提交的新记录 | ❌ 不能,看到的是旧版本 |
当前读是否能看到别的事务刚提交的记录 | ✅ 能看到,当前读不走 MVCC |
当前读是否加锁 | ✅ 加排他锁,阻塞并发写操作 |
锁是否在事务中立即释放 | ❌ 不会,直到 COMMIT / ROLLBACK 才释放 |
如何查看锁持有状态 | ✅ 用 SHOW ENGINE INNODB STATUS + innodb_trx 查看 |
performance_schema 能否替代老锁表 | ✅ 推荐使用 data_locks 和 data_lock_waits |
🔄 三、ROLLBACK 撤销事务
内容点 | 说明与示例简述 |
---|---|
作用 | 撤销事务内的所有操作,恢复到事务开始前的状态 |
常见用法 | 校验失败、异常中断、业务取消、死锁回滚 |
搭配 SAVEPOINT | 实现“部分回滚”逻辑控制 |
行锁释放 | ROLLBACK 会自动释放当前读加的锁 |
对 DDL 无效 | 如 ALTER TABLE 会隐式提交,不能被 ROLLBACK 撤销 |
自动提交下无效 | autocommit = 1 时每条语句立即提交,ROLLBACK 无效 |
底层机制依赖 | 依赖 Undo Log 回滚数据,不会写 binlog,Redo 不落盘 |
🔍 四、事务状态排查方法
工具/命令 | 说明 |
---|---|
SHOW ENGINE INNODB STATUS\G | 查看当前事务、锁、死锁、读视图等 InnoDB 信息 |
information_schema.innodb_trx | 查看活动事务、事务ID、锁、回滚等 |
performance_schema.data_locks | 替代 innodb_locks,查看当前所有锁持有情况 |
performance_schema.data_lock_waits | 查看事务之间的锁等待关系 |
📚 五、实操项目(高价值)
✅ 快照读实验(多次 SELECT 结果一致)
✅ 当前读实验(FOR UPDATE 加锁)
✅ 插入新记录事务可见性测试
✅ 锁状态监控与观察
✅ ROLLBACK 撤销事务并释放锁
✅ 配合事务工具查看锁结构
✅ 手动设置事务隔离级别,排查幻读来源