并发安全问题之超卖问题

并发安全问题之超卖问题

乐观锁总结:

优点 :不加锁性能好。
缺点 :同时请求成功率低(即只要发现数据变了就放弃了)。
乐观锁思想的具体体现 :一共两步,第一步,先查询状态。第二步,再更新数据时必须where等于前面的状态,确保数据没有改变。

第二步集查询和操作数据于一身具有原子性。

在有数量限制的业务中(即先查询的就是这个数据),要想提高成功率,可以在第二步中数据不必等于第一步查询的数据,而是小于第一步中查询的数据即可,这样就可以完美降低失败率,只有数量耗尽时才会失败。

**举个例子:**比如卖书,书有数量限制num_total=10,以卖出数量为num:

第一步查询:select * from book where id = xxx;

if (book.num < book.num_total) {可以继续执行第二步} else {拒绝卖书操作}

第二步查询加更新:update book set num = num + 1 where num < num_total;

第二步中没有使用标准的乐观锁即数据没有被操作才更新 (num = #{num})

而是让num < num_total只要没有达到库存上限即可操作,提高了并发的成功率,只要不是num=num_total都可以成功。

典型查询、判断、更新三个操作非原子性



解决方案-加锁即可,加锁的思想分为两类:悲观锁和乐观锁。

悲观锁是在操作数据之前先获取锁,有锁才能操作,这样安全了,但是性能下降了,把并发改为了单线程串行执行。
乐观锁不加锁,只会先查询一次,然后在操作数据时再查询一次(这里的查询与修改是原子性的,例如前面第一次查询变量a为1,等到操作数据时就要在SQL中update xxx set xxx=xxx where a = 1,这样就让查询和修改操作具有原子性),如果数据改变了就异常或者重试。







相关推荐
eralong25 分钟前
Java 面向对象:继承、多态、接口
java·后端
哦虎!28 分钟前
【数据库】事务
java·数据库·mysql
CDN36039 分钟前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速
程序员黑豆1 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天161 小时前
Electron面试题-Day19
java·javascript·electron
GeekZHR2 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
侧耳倾听1112 小时前
java 日志框架简介
java·开发语言
她的男孩3 小时前
我用 LLM 把后台 CRUD 效率提升 10 倍:AI 代码生成器的架构与落地实践
java·后端·架构
土司大王3 小时前
LeetCode hot100——移动零
java·算法·leetcode
thefool1122663 小时前
相同的树`
java