From 889af8b2dbecfaa72999b4b3f46400a67d707c69 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sun, 23 Jul 2023 19:34:23 +0800 Subject: [PATCH] fix: fix redemption can be used multiple times in some cases --- model/redemption.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/model/redemption.go b/model/redemption.go index 369e1f69..fafb2145 100644 --- a/model/redemption.go +++ b/model/redemption.go @@ -51,20 +51,21 @@ func Redeem(key string, userId int) (quota int, err error) { redemption := &Redemption{} err = DB.Transaction(func(tx *gorm.DB) error { - err := DB.Where("`key` = ?", key).First(redemption).Error + err := tx.Set("gorm:query_option", "FOR UPDATE").Where("`key` = ?", key).First(redemption).Error if err != nil { return errors.New("无效的兑换码") } if redemption.Status != common.RedemptionCodeStatusEnabled { return errors.New("该兑换码已被使用") } - err = DB.Model(&User{}).Where("id = ?", userId).Update("quota", gorm.Expr("quota + ?", redemption.Quota)).Error + err = tx.Model(&User{}).Where("id = ?", userId).Update("quota", gorm.Expr("quota + ?", redemption.Quota)).Error if err != nil { return err } redemption.RedeemedTime = common.GetTimestamp() redemption.Status = common.RedemptionCodeStatusUsed - return redemption.SelectUpdate() + err = tx.Save(redemption).Error + return err }) if err != nil { return 0, errors.New("兑换失败," + err.Error())