分布式锁也无法解决的并发问题

just路人周 2021-05-17 03:08:58
我有一个扣款的操作,前端发起扣款后,执行下面的业务代码,比如账户里面有100元,在极短的时间内,用户快速点击2次,每次的耗时非常短,导致第一次上锁执行成功后立即释放锁
第二次可以重新拿到锁,导致扣款出现2次,在不对数据库上锁的情况下如何避免重复执行的问题

try {
Db::startTrans();
$res = $this->lock->lock($expire=5); // 尝试上锁
if($res){
// 上锁成功
// TODO: 执行扣款DB操作
}else{
throw new Exception("请稍后再试")
}
Db::commit();
$this->lock->unlock(); // 释放锁
}catch (Exception $exception){
Db::rollback();
$this->lock->unlock(); // 释放锁
}
...全文
352 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
李睿_Lee 2021-05-20
引用 3 楼 just路人周 的回复:
[quote=引用 1 楼 李睿_Lee 的回复:]扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。
这个和事务并没有什么关联,好比我微信连续给同一个好友发2次红包,扣2次款,每次扣款都是一个独立的事务[/quote] 那你这个应该在前端解决这个问题,提交按钮只能点击一次。和后端没有半毛钱关系。
  • 打赏
  • 举报
回复
just路人周 2021-05-18
引用 1 楼 李睿_Lee 的回复:
扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。
这个和事务并没有什么关联,好比我微信连续给同一个好友发2次红包,扣2次款,每次扣款都是一个独立的事务
  • 打赏
  • 举报
回复
你这是重复提交问题,不是并发问题 解决重复提交问题,一般是加token 当然你可以百度一下其他方案
  • 打赏
  • 举报
回复
李睿_Lee 2021-05-17
扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。
  • 打赏
  • 举报
回复
相关推荐
发帖
Framework
加入

4247

社区成员

国内外优秀PHP框架讨论学习
社区管理员
  • Framework
申请成为管理员
帖子事件
创建了帖子
2021-05-17 03:08
社区公告
暂无公告