feat: 迁移 Admin Repository 到 MySQL 8 (#79)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user