用通俗语言解释异常
- 脏读 — 看到另一个事务未提交的写入。
- 不可重复读 — 两次读取同一行得到不同值。
- 幻读 — 重复查询返回了新插入的行。
- 写偏斜 — 两个事务读取重叠数据、写入不相交的行,在快照隔离下违反跨行不变量。
选择级别
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 逻辑会竞争;应使用约束、锁或更高级别来强制不变量。没有幂等性的序列化失败重试可能造成重复副作用。用两个会话测试并发;单线程测试无法覆盖隔离行为。