如何避免重复扣款--支付并发性问题。

为什么会重复扣费?

  • 客户误操作点了两次
  • 客户跳到支付平台界面,但是支付平台反抗充值界面有超时,客户又发起了一次购买流程。

方案1:for update加锁

之前在坦桑尼亚做TTCL项目的时候遇到代理商充值计费系统返回系统报错。

跟sql日志发现,给用户充值的时候先会给该用户select *** from *** for update上锁,然后进行充值,充值成功后会commit解锁。

比如充值操作的时间是1秒,侧面可以看出该操作出现的原因是,一内内也就是充值订单完成前,又有一笔充值,但是该用户已经上锁,导致操作失败。

for update大量用于存在高并发并且对于数据的准确性很有要求的场景。

比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。充值去用户有100RMB,计划充值20元,而1秒内女朋友帮他充值50元进行了update将余额更新为150元了,而原来事务还没有结束,当本身的充值20成功后会基于原来的balance+recharge_amount,变为120,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。

弊端:上锁解决了高并发时的覆盖update问题,但是也造成了另一笔业务意义上没毛病操作报错。

有没有类似的解决方式呢?其实我们上述的for update之后然后做操作是属于悲观锁方案。

也有另外一种乐观锁,

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值