背景
先说需要避免哪一种业务异常,再讨论隔离级别,远比直接选择最高级别有效。库存扣减和账户转账关注的约束并不相同。
核心判断
- 用并发事务复现丢失更新、写偏差等风险。
- 能通过原子 SQL、唯一约束或行锁表达的规则,尽量交给数据库。
- Serializable 冲突可能导致事务失败,调用方准备有限重试。
最小示例
下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。
BEGIN ISOLATION LEVEL SERIALIZABLE;
UPDATE accounts SET balance = balance - 10 WHERE id = 1;
COMMIT;
边界与误区
示例只有一次扣款,不是完整转账。重试必须从事务开始重新执行,事务外已经发生的副作用也要考虑幂等。
验证方式
使用两个连接安排读写交错,验证业务不变量;对 serialization failure 注入重试,并检查重试预算与外部副作用是否重复。
小结
从业务不变量出发选择隔离级别,并为 serialization failure 准备有限重试。