问题描述
客户端执行下单操作,后台接受到订单信息,一般的做法都是查询余额以及对比商品的价格,假如余额小于商品价格则不能够下单成功,但是我出现了,连续下入两单的操作,并且扣除客户余额未负的情况。
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
我的逻辑代码为。
IF(客户余额<商品价格){
执行下单操作,记录下单日志。事务提交的
}
你期待的结果是什么?实际看到的错误信息又是什么?
请问下我的逻辑是否有问题,为什么会出现连续下单,扣除余额为负的情况
客户端执行下单操作,后台接受到订单信息,一般的做法都是查询余额以及对比商品的价格,假如余额小于商品价格则不能够下单成功,但是我出现了,连续下入两单的操作,并且扣除客户余额未负的情况。
// 请把代码文本粘贴到下方(请勿用图片代替代码)
我的逻辑代码为。
IF(客户余额<商品价格){
执行下单操作,记录下单日志。事务提交的
}
请问下我的逻辑是否有问题,为什么会出现连续下单,扣除余额为负的情况
看一下sql语句,扣款方式使用的是 SET money = 100-80 还是SET money = money - 80;
前者在并发的情况下,不管下几单,money最终只会等于20.后者肯定能够扣完订单数对应的余额.
2 回答1.3k 阅读✓ 已解决
1 回答988 阅读✓ 已解决
2 回答849 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答906 阅读
1 回答891 阅读
1 回答820 阅读
下单就扣除余额了吗?不是要确认支付么?
接口的冥等性是常见的现象,前端在发起下单时最好做等待响应,这段时间内屏蔽发起下单的触发。
考虑到前端BUG的存在或者不可控因素,前端发起订单的时候最好携带一个唯一码,这个唯一码可以是后端提前生成,图方便也可以前端生成,在发起订单的时候后端检查这个唯一码在订单表中是否存在,来校验是否为重复的发起。
你上面的事务逻辑只能保证你的订单和扣款是正常的,但是这种极端的情况,两个订单请求都是同时到达服务端,这时两者查询都是符合扣款条件的,你的事务只能保证订单和扣款正常更新。