6

2016-02-01 23:03:08 +08:00   1

如果纯在 mysql 的场景下操作,不用内存 key-value 系统,我更倾向于用另外一种模型处理这种竞争抢购的逻辑。

“需要先 select ,然后 insert ,最后 update -1 。最后这个-1 操作是不能出现负数的”

我可以分享一下我的思路,以及我的做法。

首先,楼主以及这个文章都提到超售的问题,如果你的系统设计上能出现超售,那说明你的逻辑太差。就这种 select insert update-1 的模型,在抢购的瞬间是怎么操作的呢?我们分析一下:

首先 用户 submit_order, 先去 select 库存,判断有,然后 insert 一个 order 表数据,然后 update 库存减 1

在 MYSQL 并发非常高的瞬间,这三部操作,都可能出现大坑,只要三步中一个操作被锁坑了,整体就坑了。

然后我们再抽象:假设抢购 50000 件商品

抢购前,库存表一条记录 值 50000 ,订单表 0 条记录

抢购后,订单表 50000 条记录,库存表 1 条记录,值 0

在抢购过程中(假设非常火, 5 秒钟抢完)

中间 select 次数远大于 50000 (抢购失败的也得查询库存), update50000 次库存表-1 , insert50000 个订单表 这么多查询吧。这三步是一个顺序逻辑,任何一步出问题整个操作都失败。

我的抢购系统,绝对不会设计的!

我有 50000 件商品,我在抢购开始前一个小时到抢购前 5 分钟, 55 分钟的时间里,写入订单表 50000 条记录。其中 orders 表的 uid 做 unique 约束。 UID 使用-1~-50000 预先填写好

我有 55 分钟时间插入 50000 条记录,不用 5 秒钟, MYSQL 无负载无压力

开始抢购,所有人就开放一个接口,拼命地往数据库里提交一个查询

update ignore `orders` set uid = '你的 UID' where uid<0 and item=3 limit 1

不用等执行结果 完全非阻塞的只接受一个指令 就行了

整个抢购过程,就是一群人发一个查询往里去,等管理端发现 50000 个记录确认都有主了,抢购结束标志设置好,关闭抢购接口,完成抢购。大家可以访问我的订单看抢购结果了。

mysql修改库存量_mysql update 库存问题相关推荐

  1. mysql update修改数据_MySQL UPDATE:修改数据(更新数据)

    在 MySQL 中,可以使用 UPDATE 语句来修改.更新一个或多个表的数据. UPDATE 语句的基本语法 使用 UPDATE 语句修改单个表,语法格式为: UPDATE SET 字段 1=值 1 ...

  2. mysql 关联更新_MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  3. mysql 修改列名_mysql增加列修改列名列属性以及删除列

    首先推荐一本初学者的书,一个小册子:<mysql必知必会>简介实用,权威:有点贵,昨天才买的. http://www.2cto.com/ebook/201112/30389.html 正文 ...

  4. mysql修改数据类型_MySQL修改字段类型

    mysql> alter table 表名 modify column 字段名 类型.数据库中address表 city字段是varchar(30),修改类型可以用(谨慎修改类型,可能会导致原有 ...

  5. mysql修改视图_MySQL视图的应用之修改视图

    MySQL视图的应用之修改视图 为了提高工作效率,对不满足条件的视图可以通过修改的方式进行更改.实现本章中的实例,我们首先要创建数据表,然后在创建视图,先不要着急,我们下面会详细介绍!~ 那么在我们开 ...

  6. mysql怎么升级_MySQL UPDATE 更新

    MySQL UPDATE 更新 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQ ...

  7. 查看mysql 更新命令_MySQL UPDATE 查询

    MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...

  8. mysql join 去重_MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表...

    1 问题来源 这几天在项目中遇到一个问题:由于前期设计不合理,导致后期用户录入数据时,基础数据表中有重复多余数据.如下: 出现两个 2G网络测试手机 这样类似的基础数据,直接后果就是用户在使用这个基础 ...

  9. mysql 修改结束符_MySQL数据库中DELIMITER修改结束符教程及应用实例

    关于DELIMITER 在MySQL中默认的结束符DELIMITER是;,它用于标识一段命令是否结束.在默认情况下,在命令行客户端中,如果有一行命令以;结束,那么回车后,MySQL将会执行该命令. 修 ...

最新文章

  1. tcpdump基础教程
  2. 希尔排序(插入排序的优化算法)
  3. Consul 入门指南
  4. hdu 5086(dp)
  5. 【数论】【杜教筛】选数(P3172)
  6. 《Flutter in action》开放下载!闲鱼Flutter企业级实践精选
  7. C++11左值和右值引用讲解
  8. python的根号运算_python怎么表示根号运算
  9. Hadoop2.x介绍与源代码编译
  10. CSS 颜色代码大全
  11. ksu7对讲机调频软件_建伍TK3107对讲机调频及软件处理设置
  12. grep、cut、sed、awk
  13. 用户体验优化事半功倍:如何绘制客户行为轨迹图
  14. Stimulsoft reports 2022.4.2
  15. 免费域名证书最新申请方式大全
  16. springboot +mybatis实现多表一对一查询
  17. JavaScript学习笔记(二)
  18. Javaweb之核心技术(绘话技术)
  19. 简讯:明道云近期荣获的三项荣誉
  20. CockRoachDB配置跨域集群

热门文章

  1. 【Unity 31】 Unity中的文件读写, json,Get和Post,聚合数据接口的使用
  2. CrystalDiskInfo硬盘信息检测工具(绿色版)
  3. winserver2003服务器系统怎么连接存储器,怎样在Win 2003下使用USB便携存储器
  4. 杂论——wly_sh调查笔记
  5. C++ | 数据库连接池
  6. 日志系统优化选型之采集端
  7. 新浪微博的id和mid互相转换(10进制和62进制转换)
  8. xhmtlMP基础(wap2.0开发)
  9. php音乐链接,用PHP获取虾米音乐网的下载链接_php
  10. [2010-02-21] 一场关于Google成功因素的大辩论