php并发扣款,PHP 并发扣款,保证数据一致性(悲观锁)
业务场景分析
用户购买商品的逻辑中,需要对用户钱包的余额进行查询和扣款
异常:如果同一用户并发执行多个业务进行”查询+扣款”的业务中有一定概率出现数据不一致
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 并发扣款,保证数据一致性(悲观锁)相关推荐
- 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)
PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...
- 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构...
互联网行业是大势所趋,从招聘工资水平即可看出,那么如何提升自我技能,满足互联网行业技能要求?需要以目标为导向,进行技能提升,本文主要针对高并发分布式系统设计.架构(数据一致性)做了分析,祝各位早日走上 ...
- 精妙绝伦的并发艺术品 — ConcurrentHashMap是如何保证线程安全的
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 | 前言 阅读此 ...
- MySQL锁机制:高并发场景下该如何保证数据读写的安全性?
锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应 ...
- 电商实例、业务并发、网站并发及解决方法
一.怎么防止多用户同一时间抢购同一商品,防止高并发同时下单同一商品 最近在做抢购系统,但头疼的是,在多用户高并发的情况下经常会库存出现问题.排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而 ...
- 高并发-【抢红包案例】之二:使用悲观锁方式修复红包超发的bug
文章目录 概述 超发问题分析 使用数据库锁的解决方案 使用悲观锁(排它锁 for update) 使用乐观锁(依靠表的设计和代码) 总结 悲观锁(抽象的描述,不真实存在这个锁) 共享锁(S锁) 排他锁 ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 队列处理高并发_高并发场景下缓存处理的一些思路
在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...
- MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性
原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...
最新文章
- Javascript基础系列之(三)数据类型 (数值 Number)
- 【数据分析R语言系列】R语言函数与函数式编程、作用域和apply 家族
- 结束oracle import,Oracle 结束 imp/exp 和 expdp/impdp 进程的正确方法
- JS中数组Array的用法{转载}
- C小项目 —— 学生信息管理系统
- Gensee Android SDK(一)组成结构
- Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
- RocketMQ 集群部署模式 理论介绍
- 博客linux系统下载器,linux的下载工具
- labView2015 学习之项目创建模板篇
- 分享微软一站式示例脚本库 - IT专业人士的省时利器
- Oracle函数保留两位小数
- 一位acm过来人的心得
- IOS对自动播放语音视频做了限制,h5如何实现间隔一段时间自动播放语音
- 我们可能都低估了浪潮存储
- GitLab系列3 Unicorn
- 保险行业的“偿二代”
- 特征提取网络之Darknet
- Enhancer是啥
- 国仁网络资讯:微信视频号怎么变现赚钱;首先要了解平台的底层逻辑与算法原理。
热门文章
- 来活儿了!赶紧检查下代码里有没有脏话...
- 皮一皮:低调的凡尔赛...
- SpringBoot集成WebSocket,实现后台向前端推送信息
- 自律到极致-人生才精致:第9期
- c语言double变量后面几个0,C语言double型变量的初始化到底是是0还是0.0?
- T-SQL和安全机制
- 从点云中重建三维物体实例RfD-Net
- einops 张量操作
- bat no moudle named xxx
- Jetson Xavier(Ubuntu18.04)安装固态硬盘并挂载到/home区下