2
0
Эх сурвалжийг харах

fix: fix redemption can be used multiple times in some cases

JustSong 2 жил өмнө
parent
commit
889af8b2db

+ 4 - 3
model/redemption.go

@@ -51,20 +51,21 @@ func Redeem(key string, userId int) (quota int, err error) {
 	redemption := &Redemption{}
 	redemption := &Redemption{}
 
 
 	err = DB.Transaction(func(tx *gorm.DB) error {
 	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 {
 		if err != nil {
 			return errors.New("无效的兑换码")
 			return errors.New("无效的兑换码")
 		}
 		}
 		if redemption.Status != common.RedemptionCodeStatusEnabled {
 		if redemption.Status != common.RedemptionCodeStatusEnabled {
 			return errors.New("该兑换码已被使用")
 			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 {
 		if err != nil {
 			return err
 			return err
 		}
 		}
 		redemption.RedeemedTime = common.GetTimestamp()
 		redemption.RedeemedTime = common.GetTimestamp()
 		redemption.Status = common.RedemptionCodeStatusUsed
 		redemption.Status = common.RedemptionCodeStatusUsed
-		return redemption.SelectUpdate()
+		err = tx.Save(redemption).Error
+		return err
 	})
 	})
 	if err != nil {
 	if err != nil {
 		return 0, errors.New("兑换失败," + err.Error())
 		return 0, errors.New("兑换失败," + err.Error())