嗨,我有一个需要修复的程序。这是问题所在:
例如我有:
2的免费积分和5的常规积分。
例如,我想购买3个学分的项目。
我想扣除2个免费积分和1个普通积分。
所以余额将是0免费积分和4个常规积分。
免费积分将是扣除常规信用额度之前的第一笔。
在我现有的课程中,如果我购买1件3学分
这里是平衡出来的: -1免费积分 5个常规学分
哪个不是那样的。
我想要这样: 0免费积分 4个常规学分
我希望有人可以帮我解决这个问题。 谢谢。
答案 0 :(得分:1)
$free_credits -= $cost;
if($free_credits < 0) {
$regular_credits += $free_credits;
$free_credits = 0;
}
或者最好直接在SQL中:
START TRANSACTION;
SELECT @ok := (free_credits + regular_credits) > :cost
FROM user_credits WHERE id = :id FOR UPDATE;
IF @ok THEN
UPDATE user_credits
SET
free_credits = free_credits - :cost,
regular_credits = regular_credits + IF(free_credits < 0, free_credits, 0)
WHERE id = :id
ELSE;
/* something to cause the commit to fail */
END IF;
COMMIT;
作为一项技术性工作,为了实现这一点,free_credits的数据类型需要签名。