|
|
@@ -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())
|