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 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
leo
最佳答案

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

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

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

5年前 评论

@leo 原来如此,感谢大神

5年前 评论

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

5年前 评论

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