隔离级别是什么
SQL 标准定义四个事务隔离级别:读未提交、读已提交、可重复读、可串行化,级别越高并发异常越少但并发度越低。它们控制的典型异常是脏读、不可重复读与幻读。需要注意的是各数据库的实现与标准描述并不完全一致,例如 MySQL InnoDB 的可重复读在多数场景下避免了幻读,PostgreSQL 的读已提交允许不可重复读,排查并发问题时必须以所用数据库的文档为准。
级别与异常
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 可能 | 可能 | 可能 |
| 读已提交 | 不可能 | 可能 | 可能 |
| 可重复读 | 不可能 | 不可能 | 可能(取决于实现) |
| 可串行化 | 不可能 | 不可能 | 不可能 |
基本信息
| 异常类型 | 脏读读到他事务未提交数据;不可重复读同一行两次读结果不同;幻读同一条件两次查出不同行数 |
|---|---|
| 除上述之外 | 写偏斜、丢失更新等异常在标准三级内仍可能发生 |
| MySQL 默认 | 可重复读,依赖多版本并发控制提供一致性读 |
| PostgreSQL 默认 | 读已提交,可显式提升到可重复读或可串行化 |
| 可串行化代价 | 冲突时可能返回序列化失败,应用需实现重试 |
典型使用场景
- 库存扣减:并发下需要防止超卖,通常配合行锁或原子更新
- 账户转账:同一批账户余额需满足约束,考虑可串行化或显式加锁
- 报表统计:只读任务可用较低隔离级别,减少对写入的影响
- 对账任务:需要在某一时间点看到一致快照,选用可重复读
- 并发问题排查:先确认当前隔离级别,再复现异常现象
- 长事务治理:识别持有快照过久的事务,避免影响清理与并发
提高隔离级别不能解决所有并发问题:应用层还需要唯一约束、条件更新、乐观锁版本号等配合,才能覆盖写偏斜与丢失更新。
把可重复读等同于可串行化是常见误判,写偏斜类异常不会因此消失,资金与库存场景会直接出现业务事故。