Skip to content

Commit 889af8b

Browse files
committed
fix: fix redemption can be used multiple times in some cases
1 parent 4eea096 commit 889af8b

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

model/redemption.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,21 @@ func Redeem(key string, userId int) (quota int, err error) {
5151
redemption := &Redemption{}
5252

5353
err = DB.Transaction(func(tx *gorm.DB) error {
54-
err := DB.Where("`key` = ?", key).First(redemption).Error
54+
err := tx.Set("gorm:query_option", "FOR UPDATE").Where("`key` = ?", key).First(redemption).Error
5555
if err != nil {
5656
return errors.New("无效的兑换码")
5757
}
5858
if redemption.Status != common.RedemptionCodeStatusEnabled {
5959
return errors.New("该兑换码已被使用")
6060
}
61-
err = DB.Model(&User{}).Where("id = ?", userId).Update("quota", gorm.Expr("quota + ?", redemption.Quota)).Error
61+
err = tx.Model(&User{}).Where("id = ?", userId).Update("quota", gorm.Expr("quota + ?", redemption.Quota)).Error
6262
if err != nil {
6363
return err
6464
}
6565
redemption.RedeemedTime = common.GetTimestamp()
6666
redemption.Status = common.RedemptionCodeStatusUsed
67-
return redemption.SelectUpdate()
67+
err = tx.Save(redemption).Error
68+
return err
6869
})
6970
if err != nil {
7071
return 0, errors.New("兑换失败," + err.Error())

0 commit comments

Comments
 (0)