标准答案

  1. READ UNCOMMITTED 可能读到未提交数据,通常很少用于需要可靠业务结果的场景。
  2. READ COMMITTED 只读已提交数据,同一事务两次查询可能看到其他事务刚提交的新结果。
  3. REPEATABLE READ 通常让同一事务的普通读保持一致快照,但不同数据库对幻读和当前读的处理细节不同。
  4. SERIALIZABLE 追求等价于串行执行,通常通过更严格锁或冲突检测实现,吞吐和等待成本更高。
  5. 应按业务不变量选择隔离、条件更新、唯一约束或显式锁,不能只依据名称假设所有引擎行为相同。

题目解析

隔离级别并不是越高越好。报表或普通详情读取常可容忍短暂变化,库存扣减、资金状态推进则需要更强的并发控制。过高隔离会让本来无冲突的请求也发生等待、回滚或重试。

面试和设计中应说明目标异常。例如要防止余额被并发扣成负数,条件更新加约束可能比把整个业务提升到 SERIALIZABLE 更精准且成本更低。

常见误区

  • 把可重复读等同于所有数据库、所有查询都绝不会出现幻读。
  • 为了解决一个单行竞争直接全局提升隔离级别,造成无关请求大量阻塞。

作者信息