首页/开发/系统分析与架构设计速查/可串行化(Serializability)

可串行化(Serializability)

事务隔离的最高级别:并发事务的执行结果等价于某种串行执行顺序;它保证多对象事务的正确性,但通常伴随吞吐下降或冲突重试。

可串行化是什么

可串行化(Serializability)是事务隔离的最高级别:并发事务的最终执行结果,等价于这些事务按某个串行顺序依次执行。它保证涉及多个对象的事务不会出现写偏斜、幻读等异常,代价是冲突时阻塞或回滚重试,吞吐随之下降。需要注意的是它与线性一致侧重点不同:可串行化约束的是事务之间的等价关系,线性一致约束的是单对象上的实时先后顺序,两者不是同一件事。

基本信息

保证范围多对象事务的执行结果等价于某种串行顺序
实现方式两阶段锁、乐观并发控制、串行图检测
主要代价冲突时阻塞或重试,吞吐与尾延迟受影响
与线性一致的区别前者约束事务等价性,后者约束单对象的实时顺序
工程现实多数数据库的「可重复读」并非快照隔离的完全等价物,需按具体实现确认

典型使用场景

  • 账务扣减:余额计算与流水写入必须保持原子语义,不能出现中间态被读到
  • 库存扣减:并发下单时避免超卖,涉及多行更新的约束检查
  • 唯一性约束校验:先查后插的场景在低隔离级别下可能被并发插入破坏
  • 多表一致性维护:主表与明细表状态必须同步推进的业务操作
  • 对账与冲正:批量修正数据时要求事务之间互不干扰
  • 序列号分配:号码段与业务单据必须一一对应

隔离级别与典型异常

级别可能异常适用场景
读已提交不可重复读、写偏斜一般业务查询与展示
可重复读写偏斜、幻读(视具体实现而定)多数交易类业务,需按数据库实现核对
可串行化理论上无异常,代价是冲突重试账务、库存等强约束场景
快照隔离写偏斜仍可能发生读多写少且可接受冲突较轻的场景

落地要点

落地要点
# 1 按业务风险选级别:只有涉及金额、库存与唯一性约束的操作才需要最高级别
# 2 冲突必重试:可串行化下序列化冲突是正常现象,业务层需有重试上限与退避
# 3 事务要短:事务内不要做远程调用、发消息或等待用户输入,否则锁持有时间被拉长
# 4 加锁顺序统一:多个事务访问同一批记录时使用固定顺序,降低死锁概率
# 5 观测:统计冲突率、重试次数与事务平均耗时,超阈值需调整设计
# 6 校验:用并发测试脚本验证约束在目标隔离级别下确实成立
多数业务只需要可串行化的一个子集(例如快照隔离加显式的唯一约束或版本校验),默认把全部事务提到最高级别通常得不偿失。
出现序列化冲突后没有重试策略时,业务会随机失败:调用方看到偶发报错却难以复现,务必把重试与退避写进接入规范。

易错点

  • 使用快照隔离却按可串行化理解:写偏斜类问题没有被覆盖,数据悄悄出错
  • 出现序列化冲突后无重试策略:业务随机失败,问题难以复现与定位
  • 事务内包含远程调用或等待:锁持有时间被拉长,冲突与死锁显著增加
  • 把全部事务提升到最高隔离级别:吞吐下降却换不来对应的业务收益
  • 先查后插不做约束保护:并发下唯一性被破坏,事后靠人工修数据

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann,O'Reilly)第 7 章
  • PostgreSQL 文档:Transaction Isolation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌