mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
登记请求只有金额,提交成功但响应丢失时,管理员重试会把同一笔站外打款再扣 一次返利额度。现在一次登记由 Idempotency-Key 标识,数据库在同一事务内以唯一 约束去重: - user_affiliate_ledger 新增 operation_id(幂等键派生的 SHA-256)与部分唯一 索引(迁移 240);接口要求 Idempotency-Key,缺失或非法返回 400 - 事务内先以 operation_id 写入占位流水,再解冻、扣减并补写额度快照;同键 重试返回首笔流水的结果并带 X-Idempotency-Replayed,不重复扣减;同键换了 用户或金额返回 409 IDEMPOTENCY_KEY_CONFLICT;额度不足时占位随事务回滚 - 并发的同键请求在唯一索引上等待先到者:先到者提交则返回同一条流水,回滚 则自行登记 - 弹窗在网络错误、超时、5xx、408/409 时锁定用户与金额,重试沿用同一请求与 幂等键;幂等键按管理员、用户、金额暂存于 sessionStorage,登记有确定结果后 释放
11 lines
603 B
SQL
11 lines
603 B
SQL
-- 管理员登记线下提现的幂等标识:同一 operation_id 只对应一条流水,
|
|
-- 重试同一次登记时据此返回首次登记的结果,不重复扣减。
|
|
ALTER TABLE user_affiliate_ledger
|
|
ADD COLUMN IF NOT EXISTS operation_id VARCHAR(64);
|
|
|
|
COMMENT ON COLUMN user_affiliate_ledger.operation_id IS '管理员登记线下提现的幂等标识(由 Idempotency-Key 派生的 SHA-256 十六进制串);其他流水为 NULL';
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_user_affiliate_ledger_operation_id
|
|
ON user_affiliate_ledger (operation_id)
|
|
WHERE operation_id IS NOT NULL;
|