业务场景分析

用户购买商品的逻辑中,需要对用户钱包的余额进行查询和扣款

异常:如果同一用户并发执行多个业务进行”查询+扣款”的业务中有一定概率出现数据不一致

Tips:如果没有做限制单一接口请求频率,用户使用并发请求的手段也有概率出现数据不一致

扣款场景

Step1: 从数据库查询用户钱包余额

Step2: 业务逻辑

Tips: 文章分享处理同一用户并发扣款一致性,检查库存啥的逻辑略过

1、 查询商品价格,比如70元 2. 商品价格对比余额是否足够,足够时进行扣款提交订单逻辑

Step3: 将数据库的余额进行修改

在没有并发的情况下,这个流程没有任何问题,原有余额100,购买70元的商品,剩余30元

异常场景

Step1: 用户并发购买业务A和业务B(不同实例/服务),一定概率并行查询余额是100

Step2: 业务A和业务B分别扣款逻辑处理,业务A商品70结果余额30,业务B商品80结果余额20

Step3:

1 业务A先进行修改,修改余额为30

2 业务A后进行修改,修改余额为20

此时异常出现了,原余额100元,业务A和业务B的商品价格总和150元(70+80)都购买成功且余额还剩20元。

异常点:业务A和业务B并行查询余额为100

解决方案

悲观锁

使用Redis悲观锁,例如抢到一个KEY才能继续操作,否则禁止操作

封装了一个开箱即用的RedisLock

乐观锁

使用CAS(Compare And Set)

在set写回的时候,加上初始状态的条件compare,只有初始状态不变的时候才允许set写回成功,保证数据一致性的方法

将:

改为:

这样的话并发操作时只有一个是执行成功的,根据affect rows是否为1判断是否成功

结语

解决方案有很多,这只是其中一种解决方案

使用Redis悲观锁的方案会降低吞吐量

php并发扣款,PHP 并发扣款,保证数据一致性(悲观锁)相关推荐

  1. 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)

    PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...

  2. 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构...

    互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对高并发分布式系统设计.架构(数据一致性)做了分析,祝各位早日走上 ...

  3. 精妙绝伦的并发艺术品 — ConcurrentHashMap是如何保证线程安全的

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 | 前言 阅读此 ...

  4. MySQL锁机制:高并发场景下该如何保证数据读写的安全性?

    锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应 ...

  5. 电商实例、业务并发、网站并发及解决方法

    一.怎么防止多用户同一时间抢购同一商品,防止高并发同时下单同一商品 最近在做抢购系统,但头疼的是,在多用户高并发的情况下经常会库存出现问题.排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而 ...

  6. 高并发-【抢红包案例】之二:使用悲观锁方式修复红包超发的bug

    文章目录 概述 超发问题分析 使用数据库锁的解决方案 使用悲观锁(排它锁 for update) 使用乐观锁(依靠表的设计和代码) 总结 悲观锁(抽象的描述,不真实存在这个锁) 共享锁(S锁) 排他锁 ...

  7. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  8. 队列处理高并发_高并发场景下缓存处理的一些思路

    在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...

  9. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性

    原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...

最新文章

  1. Javascript基础系列之(三)数据类型 (数值 Number)
  2. 【数据分析R语言系列】R语言函数与函数式编程、作用域和apply 家族
  3. 结束oracle import,Oracle 结束 imp/exp 和 expdp/impdp 进程的正确方法
  4. JS中数组Array的用法{转载}
  5. C小项目 —— 学生信息管理系统
  6. Gensee Android SDK(一)组成结构
  7. Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
  8. RocketMQ 集群部署模式 理论介绍
  9. 博客linux系统下载器,linux的下载工具
  10. labView2015 学习之项目创建模板篇
  11. 分享微软一站式示例脚本库 - IT专业人士的省时利器
  12. Oracle函数保留两位小数
  13. 一位acm过来人的心得
  14. IOS对自动播放语音视频做了限制,h5如何实现间隔一段时间自动播放语音
  15. 我们可能都低估了浪潮存储
  16. GitLab系列3 Unicorn
  17. 保险行业的“偿二代”
  18. 特征提取网络之Darknet
  19. Enhancer是啥
  20. 国仁网络资讯:微信视频号怎么变现赚钱;首先要了解平台的底层逻辑与算法原理。

热门文章

  1. 来活儿了!赶紧检查下代码里有没有脏话...
  2. 皮一皮:低调的凡尔赛...
  3. SpringBoot集成WebSocket,实现后台向前端推送信息
  4. 自律到极致-人生才精致:第9期
  5. c语言double变量后面几个0,C语言double型变量的初始化到底是是0还是0.0?
  6. T-SQL和安全机制
  7. 从点云中重建三维物体实例RfD-Net
  8. einops 张量操作
  9. bat no moudle named xxx
  10. Jetson Xavier(Ubuntu18.04)安装固态硬盘并挂载到/home区下