核心问题

两个正确操作同时发生,系统还正确吗?

工程困境

单次退款逻辑正确。两次退款请求同时进来,可能重复退款。

单次购买正确。支付 webhook 重试,可能重复发放访问权。

思想模型

并发会让“先检查再修改”的逻辑失效。

check balance
  -> context switch
  -> update balance

防护工具

  • transaction
  • row lock
  • unique constraint
  • idempotency key
  • compare-and-swap
  • ledger
  • outbox

Atlas Action

找一个高价值操作:支付、退款、发券、发放访问权。问:

重复请求会怎样?
并发两个请求会怎样?
中途崩溃会怎样?

小结

并发不是多跑几次代码,而是让时间顺序变得不可信。