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

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(); // 释放锁
}
...全文
8329 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
李睿_Lee 2021-05-20
  • 打赏
  • 举报
回复
引用 3 楼 just路人周 的回复:
[quote=引用 1 楼 李睿_Lee 的回复:]扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。
这个和事务并没有什么关联,好比我微信连续给同一个好友发2次红包,扣2次款,每次扣款都是一个独立的事务[/quote] 那你这个应该在前端解决这个问题,提交按钮只能点击一次。和后端没有半毛钱关系。
just路人周 2021-05-18
  • 打赏
  • 举报
回复
引用 1 楼 李睿_Lee 的回复:
扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。
这个和事务并没有什么关联,好比我微信连续给同一个好友发2次红包,扣2次款,每次扣款都是一个独立的事务
下雨的声音丶 2021-05-17
  • 打赏
  • 举报
回复
你这是重复提交问题,不是并发问题 解决重复提交问题,一般是加token 当然你可以百度一下其他方案
李睿_Lee 2021-05-17
  • 打赏
  • 举报
回复
扣款业务,不是只有扣款操作,还要判断业务状态。 扣款操作,和业务状态的改变,是个事务。扣款操作要判断这个业务是否已经扣过款了。

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧