if ($coupon->changeUsed () <= 0) 这个判断有必要吗?

原代码:

// 增加优惠券的用量,需判断返回值
if ($coupon->changeUsed() <= 0) {
    throw new CouponCodeUnavailableException('该优惠券已被兑完');
}

在调用 changeUsed 方法之前,已经用 checkAvailable 检测过,说明到这里 ‘total’ 是绝对大于 'used' 的。
那在 changeUsed 方法里,->where('used', '<', $this->total) 的筛选是能通过的,而且 increment 只增加 1,所以正常来说,逻辑没有问题,肯定能成功加 1 啊。然后返回受影响的行数 1。
如果返回 0,那只能是其他系统或数据库问题了,并不是「该优惠券已被兑完」的错误。
我感觉要么不加这个判断条件,要么抛出系统内部异常。
不知道是不是还有我不知道的知识点,还有什么情况能导致返回 0 甚至负数?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
leo
最佳答案

需要考虑在高并发的情况下,前面即使 checkAvailable 通过之后也有可能被其他订单用掉,所以需要通过 changeUsed 来判断是不是真的使用成功。

5年前 评论
讨论数量: 3
leo

需要考虑在高并发的情况下,前面即使 checkAvailable 通过之后也有可能被其他订单用掉,所以需要通过 changeUsed 来判断是不是真的使用成功。

5年前 评论

@leo 原来如此,感谢大神

5年前 评论

嗯嗯嗯 高并发编程和普通编程考虑的细节还真不一样

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!