对于抽奖类型的业务,同时并发去修改某一条数据的剩余量,先读取再修改的方式会造成数据的异常。于是采用自减的方式,修改的字段为无符号整数。
err = tx.Table("prize").Model(&prize).Update("residual_num", gorm.Expr("residual_num- ?", 1)).Error if err != nil { return 0, err }err = tx.Table("prize").Where("id = ?",id).Update("residual_num", gorm.Expr("residual_num- ?", 1)).Error if err != nil { return 0, err }
如果自减报错,则剩余量为0,无法再中奖。