首页/开发/系统分析与架构设计速查/事务隔离级别与异常现象

事务隔离级别与异常现象

SQL 标准定义四个隔离级别:读未提交、读已提交、可重复读、可串行化,用于控制脏读、不可重复读与幻读;各数据库的具体实现与标准描述存在差异。

隔离级别是什么

SQL 标准定义四个事务隔离级别:读未提交、读已提交、可重复读、可串行化,级别越高并发异常越少但并发度越低。它们控制的典型异常是脏读、不可重复读与幻读。需要注意的是各数据库的实现与标准描述并不完全一致,例如 MySQL InnoDB 的可重复读在多数场景下避免了幻读,PostgreSQL 的读已提交允许不可重复读,排查并发问题时必须以所用数据库的文档为准。

级别与异常

级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不可能可能可能
可重复读不可能不可能可能(取决于实现)
可串行化不可能不可能不可能

基本信息

异常类型脏读读到他事务未提交数据;不可重复读同一行两次读结果不同;幻读同一条件两次查出不同行数
除上述之外写偏斜、丢失更新等异常在标准三级内仍可能发生
MySQL 默认可重复读,依赖多版本并发控制提供一致性读
PostgreSQL 默认读已提交,可显式提升到可重复读或可串行化
可串行化代价冲突时可能返回序列化失败,应用需实现重试

典型使用场景

  • 库存扣减:并发下需要防止超卖,通常配合行锁或原子更新
  • 账户转账:同一批账户余额需满足约束,考虑可串行化或显式加锁
  • 报表统计:只读任务可用较低隔离级别,减少对写入的影响
  • 对账任务:需要在某一时间点看到一致快照,选用可重复读
  • 并发问题排查:先确认当前隔离级别,再复现异常现象
  • 长事务治理:识别持有快照过久的事务,避免影响清理与并发
提高隔离级别不能解决所有并发问题:应用层还需要唯一约束、条件更新、乐观锁版本号等配合,才能覆盖写偏斜与丢失更新。
把可重复读等同于可串行化是常见误判,写偏斜类异常不会因此消失,资金与库存场景会直接出现业务事故。

易错点

  • 默认隔离级别下用“先查后改”实现库存扣减,并发时出现超卖
  • 认为可重复读就等同于可串行化,忽略写偏斜与丢失更新
  • 把连接池默认隔离级别当成全局设置,不同数据源行为不一致
  • 长事务持有老快照,导致清理机制滞后与表膨胀
  • 可串行化开启后未实现序列化失败重试,业务在冲突时直接报错给用户

数据来源与参考

  • ISO/IEC 9075 SQL 标准隔离级别定义
  • PostgreSQL 文档:Transaction Isolation
  • MySQL 8.0 Reference Manual:InnoDB 事务隔离级别
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌