feat: 迁移 Admin Repository 到 MySQL 8 (#79)

This commit is contained in:
chengma
2026-08-10 02:21:31 +08:00
parent 05793e48b3
commit 13cfced80d
29 changed files with 390 additions and 240 deletions
+16
View File
@@ -292,6 +292,22 @@ func submitInTx(
// 5. 记下幂等键。和业务写入在同一个事务里——
// 分开写的话,业务写成功但幂等没记上,客户端重试会被重复处理。
if err := repository.SaveIdempotent(tx, idemKey, hash, string(respJSON)); err != nil {
// 两个首次请求可能同时通过前面的“不存在”检查。唯一键会让其中一个
// 等待另一个提交后返回重复键;此时回滚本事务的业务写入,再读取赢家
// 保存的响应,保证并发重试拿到完全相同的结果。
if errors.Is(err, repository.ErrIdempotencyAlreadySaved) {
if rollbackErr := tx.Rollback(); rollbackErr != nil && !errors.Is(rollbackErr, sql.ErrTxDone) {
return "", fmt.Errorf("回滚重复幂等请求失败: %w", rollbackErr)
}
body, done, lookupErr := repository.LookupIdempotent(db, idemKey, hash)
if lookupErr != nil {
return "", lookupErr
}
if !done {
return "", fmt.Errorf("并发幂等请求已提交但未找到保存结果")
}
return body, nil
}
return "", err
}