标准答案
- 每次更新不会简单覆盖旧版本,数据库会保留或可通过版本链找到历史版本,并记录创建和删除版本的事务信息。
- 快照读根据事务开始时或语句开始时的可见性规则读取一致视图,通常不会等待普通写锁。
- 当前读例如 UPDATE、DELETE、SELECT FOR UPDATE 需要读取最新版本,并会结合行锁或范围锁防止并发冲突。
- 旧版本需要依赖 undo 或版本清理机制回收,长事务会阻碍回收并增加存储和扫描成本。
- MVCC 改善并发,不等于自动解决写写冲突、幻读、唯一性和业务状态竞争。
题目解析
MVCC 的好处是读者不必总等写者提交,写者也不必因为普通读者持有共享锁而停住。但它把复杂性转移到版本可见性和垃圾回收上,特别是长事务会让旧版本一直不能清理。
设计扣库存或状态机时,不能只依赖“读到了快照”。关键写入应该用条件 UPDATE、版本号或锁定读验证当前状态,确保决定基于仍然有效的版本。
常见误区
- 认为 MVCC 完全无锁,忽略写写冲突和当前读仍然会等待锁。
- 让长时间报表事务持续占用快照,导致历史版本无法清理。