标准答案
- READ UNCOMMITTED 可能读到未提交数据,通常很少用于需要可靠业务结果的场景。
- READ COMMITTED 只读已提交数据,同一事务两次查询可能看到其他事务刚提交的新结果。
- REPEATABLE READ 通常让同一事务的普通读保持一致快照,但不同数据库对幻读和当前读的处理细节不同。
- SERIALIZABLE 追求等价于串行执行,通常通过更严格锁或冲突检测实现,吞吐和等待成本更高。
- 应按业务不变量选择隔离、条件更新、唯一约束或显式锁,不能只依据名称假设所有引擎行为相同。
题目解析
隔离级别并不是越高越好。报表或普通详情读取常可容忍短暂变化,库存扣减、资金状态推进则需要更强的并发控制。过高隔离会让本来无冲突的请求也发生等待、回滚或重试。
面试和设计中应说明目标异常。例如要防止余额被并发扣成负数,条件更新加约束可能比把整个业务提升到 SERIALIZABLE 更精准且成本更低。
常见误区
- 把可重复读等同于所有数据库、所有查询都绝不会出现幻读。
- 为了解决一个单行竞争直接全局提升隔离级别,造成无关请求大量阻塞。