博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL并发处理
阅读量:7026 次
发布时间:2019-06-28

本文共 751 字,大约阅读时间需要 2 分钟。

  hot3.png

关于MySQL并发问题,还是举个例子来说明。

这里用表类型为innoDB类型

商品库存问题,当库存为0的时候就不能再下单支付了。

demo:

  1. 库存商品5件

  2. a下2件,b下1件、c下2件

正常是程序

  1. 事务开启

  2. 执行程序

  3. 回滚

  4. 提交 

MySql事务分析:

当前有三个用户a、b、c三个用户进入到了这个事务中,这个时候会产生一个共享锁,所以在select的时候,这三个用户查到的库存数量都是5个,同时还要注意,mysql InnoDB查到的结果是有版本控制的,再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是就版本;也就是说在没有commint之前,有新用户购买的数量仍旧是之前的库存量。

然后是update,假如这三个用户同时到达update这里,这个时候update更新语句会把并发串行化,也就是给同时到达这里的是三个用户排个序,一个一个执行,并生成排他锁,在当前这个update语句commit之前,其他用户等待执行,commit后,生成新的版本;这样执行完后,库存肯定为负数了。

所在在执行减库存的时候,我们最好加上条件,库量大于要买的数量。

代码:

//开启事务beginTranse();try{    //$qty为用户购买量    $db->query('UPDATE `ut_product_store` SET `amount`=`amount`-$qty WHERE `amount`>=$qty AND `id`=商品ID');}catch($e Exception){    //回滚    rollBack();}//提交事务commit();

转载于:https://my.oschina.net/lockupme/blog/656630

你可能感兴趣的文章
SCCM2012 R2实战系列之四:初始化配置
查看>>
我的友情链接
查看>>
我们是如何上网?
查看>>
JavaWEB程序员电脑必备配置
查看>>
我的友情链接
查看>>
oracle性能调优总结
查看>>
relink all the executables of 11g
查看>>
冲突域和冲突域
查看>>
Sass学习笔记 -- 嵌套
查看>>
linux日志分析及管理
查看>>
netapp学习(二)---开启DNS功能
查看>>
创建MYSQL用户及授权用户权限
查看>>
TextView颜色等属性在string.xml定义
查看>>
docker迁移容器
查看>>
HBase 表数据 导入导出
查看>>
PropertyGrid无意的发现DisplayNameAttribute及应用
查看>>
我的友情链接
查看>>
Android之计算缓存大小并且清空缓存
查看>>
tomcat报内存溢出,解决方案
查看>>
DI序曲二十五 App-V与Remote App综合使用
查看>>