解决超卖问题,常见的方式,利用redis 的原子性去递减;利用队列,队列入队计数。或者直接打到mysql 层。由mysql 保证不超卖,有几个玩法。利用属性不一样,挺有意思,记录下。

首先,mysql 隔离级别是RR,或者是串行,但是不可能用串行,太慢。

其次,为什么会出现超卖问题?因为这个select and update 是个非原子操作,是两步操作。

最后,怎么解决这个问题? 就在原子性上做文章,比如redis 的 lua 封装,将指令封装成原子操作。或者mysql 的互斥锁,再或者,干脆允许超卖,业务层做二次检查。

第一种,mysql 在select 的时候不加互斥锁,这个时候的做法:

1:开启事务

2:查询库存,并显示的设置写锁(排他锁):SELECT * FROM table_name WHERE …

3:生成订单

4:去库存,隐示的设置写锁(排他锁):UPDATE goods SET counts = counts – 1 WHERE id = 1

5:commit,释放锁

这里提下mysql 的RC 和RR 区别,mysql 是如何实现可重复读的? RR隔离级别是在事务开始时刻,确切地说是第一个读操作创建read view的;RC隔离级别是在语句开始时刻创建read view的。一个read view 可以理解成一份快照(底层只是事务id 列表),所以,RC 隔离级别下,多次读可能受其他事务commit 导致读取数据不一致。

那么 RR 级别下,select 和 update 的时候, 数据是一个version的,但是上面做法的问题,就在于,几个事务begin 后,都读到数据为1,就开始 update ,就会导致数据最终为负数,这种方式,避不了为负数。

我们可以做个二次容错,检查update 后数据为负数后,直接回滚这次事务即可。

第二种方式是select 的时候就加行锁,select for update ,直接锁住这条记录,不让其他事务读。所以对这个数据,都成串行,这个缺点就是会影响性能,但是不会出现超卖的情况了。

1:开启事务

2:查询库存,并显示的设置写锁(排他锁):SELECT * FROM table_name WHERE … FOR UPDATE

3:生成订单

4:去库存,隐示的设置写锁(排他锁):UPDATE goods SET counts = counts – 1 WHERE id = 1

5:commit,释放锁。

第三种,试着给select 加读锁,这种做法是不行,会出现死锁,什么情况会死锁呢?事务1,2同时加读锁,事务1加写锁等事务2的写锁,事务2的加写锁等事务1的读锁,相互等待,陷入死锁。那为啥 select for update 不会这样,因为mysql 互斥锁是可重入锁啊。

mysql超卖问题处理_mysql 解决超卖问题的锁分析相关推荐

  1. mysql 超卖_mysql 解决超卖问题的锁分析

    解决超卖问题,常见的方式,利用redis 的原子性去递减:利用队列,队列入队计数.或者直接打到mysql 层.由mysql 保证不超卖,有几个玩法.利用属性不一样,挺有意思,记录下. 首先,mysql ...

  2. mysql explain key为空_MySQL中explain的使用以及性能分析

    原标题:MySQL中explain的使用以及性能分析 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性 ...

  3. mysql root用户不存在_MySQL – 解决root用户下仍然出现权限问题-无法建库

    关键词(Key Words) ERROR 1006 (HY000): Can't create database Starting MySQL. The server quit without upd ...

  4. mysql索引能重复吗_mysql重复索引与冗余索引实例分析

    本文实例讲述了mysql重复索引与冗余索引.分享给大家供大家参考,具体如下: 重复索引:表示一个列或者顺序相同的几个列上建立的多个索引. 冗余索引:两个索引所覆盖的列重叠 冗余索引在一些特殊的场景下使 ...

  5. mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

  6. mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

    问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...

  7. redis mysql 解决超卖_Redis 分布式锁解决超卖问题

    Redis 分布式锁解决超卖问题 1,Redis 事物介绍 1. Redis 事物是可以一次执行多个命令, 本质是一组命令的集合. 2. 一个事务中的所有命令都会序列化, 按顺序串行化的执行而不会被其 ...

  8. mysql处理高并发,防止库存超卖

    参考:http://blog.csdn.net/caomiao2006/article/details/38568825 今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年 ...

  9. 转 mysql处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  10. mysql 高并发 优惠券_转 mysql处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

最新文章

  1. java文件格式_Java Class文件格式详解
  2. ThreadLocal原理及用法详解
  3. 第三天:制定项目计划
  4. 请求失败或服务未及时响应 有关详细信息_「干货」从零开始的微服务搭建之路...
  5. 理解SpringMVC-------DispatchServlet
  6. 打印图片的属性和实现另存图片功能以及使用numpy
  7. Java Servlet API中文说明文档
  8. 身家4400亿美元的他,吃低于3美元的早餐,和2个老婆同居28年!
  9. python自动化测试的工具_python自动化测试(3)- 自动化框架及工具
  10. 网络流专题(完结撒花)
  11. Go操作MySql Memache Mongodb
  12. 机器学习- 吴恩达Andrew Ng Week9 知识总结 Recommender Systems
  13. CodeRush For .Net 使用-------使用标签
  14. vscode - 设置 Python 版本
  15. C#,数值计算,希尔伯特矩阵(Hilbert Matrix)的算法与源代码
  16. matlab sil,丰田使用高精度发动机模型和SIL+M前置开发发动机控制系统
  17. 腾讯云学生服务器更换系统,腾讯云学生轻量服务器免费升配攻略(60G SSD系统盘不支持升级)...
  18. 光功率 博科交换机_交换机是否支持查看光模块型号及收发光功率
  19. outlook邮件撤回
  20. 23种设计模式的粗略介绍

热门文章

  1. ArcGIS Pro 创建tpk
  2. 查询语句 group by 分组
  3. python中的成员运算符用于判断指定_Python中的成员运算符用于判断指定序列中是否包含某个值...
  4. SPSS Modeler 自动分类器学习笔记
  5. Java 网络IO编程
  6. 攻防技术第一篇之-知彼(攻击手段)
  7. 网页播放Flash视频尝试的三种方式
  8. python期货交易_strategies/python版CTP商品期货交易类库.py at master · gzhou1024/strategies · GitHub...
  9. PHP 编写“九九乘法表”
  10. 运行3项目显示Module ‘“vue“‘ has no exported member ‘xxxx‘. Did you mean ‘Xxxx‘? TS2305: Module ‘“…/…/node_