← 中文资源

简体中文版本

事务隔离级别

隔离级别在并发与脏读、不可重复读、幻读和序列化异常之间取舍。应按不变量选择级别,而不是凭默认值。

阅读英文原文

用通俗语言解释异常

  • 脏读 — 看到另一个事务未提交的写入。
  • 不可重复读 — 两次读取同一行得到不同值。
  • 幻读 — 重复查询返回了新插入的行。
  • 写偏斜 — 两个事务读取重叠数据、写入不相交的行,在快照隔离下违反跨行不变量。

选择级别

BEGIN ISOLATION LEVEL SERIALIZABLE;
-- 读取不变量
-- 写入相关行
COMMIT;

独立单行操作使用 read committed。多行不变量使用 repeatable read 或 serializable。使用 serializable 时,必须用有界重试与幂等写入处理序列化失败。

-- PostgreSQL:查看并设置默认级别
SHOW default_transaction_isolation;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

何时使用哪种

使用能保持不变量所需的最低级别。与带版本列的乐观并发相比,隔离级别保护事务的视图,而不是单行更新;与显式锁相比,serializable 可能通过中止而非等待来避免死锁,但需要重试逻辑。

陷阱

read committed 下的 check-then-act 逻辑会竞争;应使用约束、锁或更高级别来强制不变量。没有幂等性的序列化失败重试可能造成重复副作用。用两个会话测试并发;单线程测试无法覆盖隔离行为。