核心问题
两个正确操作同时发生,系统还正确吗?
工程困境
单次退款逻辑正确。两次退款请求同时进来,可能重复退款。
单次购买正确。支付 webhook 重试,可能重复发放访问权。
思想模型
并发会让“先检查再修改”的逻辑失效。
check balance
-> context switch
-> update balance
防护工具
- transaction
- row lock
- unique constraint
- idempotency key
- compare-and-swap
- ledger
- outbox
Atlas Action
找一个高价值操作:支付、退款、发券、发放访问权。问:
重复请求会怎样?
并发两个请求会怎样?
中途崩溃会怎样?
小结
并发不是多跑几次代码,而是让时间顺序变得不可信。