背景

先说需要避免哪一种业务异常,再讨论隔离级别,远比直接选择最高级别有效。库存扣减和账户转账关注的约束并不相同。

核心判断

  1. 用并发事务复现丢失更新、写偏差等风险。
  2. 能通过原子 SQL、唯一约束或行锁表达的规则,尽量交给数据库。
  3. Serializable 冲突可能导致事务失败,调用方准备有限重试。

最小示例

下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。

BEGIN ISOLATION LEVEL SERIALIZABLE;
UPDATE accounts SET balance = balance - 10 WHERE id = 1;
COMMIT;

边界与误区

示例只有一次扣款,不是完整转账。重试必须从事务开始重新执行,事务外已经发生的副作用也要考虑幂等。

验证方式

使用两个连接安排读写交错,验证业务不变量;对 serialization failure 注入重试,并检查重试预算与外部副作用是否重复。

小结

从业务不变量出发选择隔离级别,并为 serialization failure 准备有限重试。