Skip to content

Commit

Permalink
sql修改
Browse files Browse the repository at this point in the history
  • Loading branch information
jingyanlei committed Dec 1, 2016
1 parent 89eb2b9 commit 210111f
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 10 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# PHP-MALL
## 商城抢购,秒杀库存超卖是比较头疼的事,下面使用三种方法防止超卖
## 1.商城抢购,秒杀库存超卖是比较头疼的事,下面使用三种方法防止超卖
```
1.mysql锁机制,悲观锁InnoDB行级锁方案,不建议使用,对数据库压力较大,如果出现死锁会导致一直不能更新,除非kill掉进程
2.mysql乐观锁 不使用第三方情况下可以使用此方案
3.redis incrby decrby原子性操作,防止超卖
4.为方便扩展,把库存类抽象出接口,方便以后扩展,也可以使用其它方式实现
```
---
一、mysql锁机制,悲观锁,InnoDB行级锁方案,查询需使用索引

### 1.1.mysql锁机制,悲观锁,InnoDB行级锁方案,查询需使用索引

```
1.事务级别必须为 SERIALIZABLE 级别
Expand All @@ -17,15 +17,15 @@
5.update件件增加验证购买数量条件 AND inventory >=1
```

二、mysql乐观锁
### 1.2.mysql乐观锁

```
数据库表增加版本字段如version,每次修改时版本号+1
如果更新操作顺序执行,则数据的版本(version)依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行修改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作会失败。
PDO update更新后,不但要验证返回状态是否为true,并且同时验证影响行数是否大于0
```

三、redis原子性操作
### 1.3.redis原子性操作

```
incr/decr原子性操作,incr增加,decr减少
Expand All @@ -43,7 +43,7 @@ if ($redis_client->decrby($key, $parmas['num']) > -1) {
使用redis测试时,每次修改完库存需要删除KEY:DEL goods_1
```

## 测试
## 2.测试
```
配置使用方式
//db 悲观锁(事务级别SERIALIZABLE) db2 mysql乐观锁 redis redis方式
Expand All @@ -59,7 +59,7 @@ nginx配置站点mall.com
测试方法使用ab测试,请求100,并发10
ab -n100 -c10 http://mall.com
```
## 问题
## 3.问题
```
注意
由于订单流程中,把验证库存和扣减库存放在了下订单前,可以减少下订单数量和开启的事务数,但如果用户在扣减库存后下订单过程中失败,会出现少卖现象
Expand Down
7 changes: 4 additions & 3 deletions mall.sql
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
Target Server Version : 50716
File Encoding : utf-8
Date: 11/30/2016 18:35:22 PM
Date: 12/01/2016 15:46:12 PM
*/

SET NAMES utf8;
Expand All @@ -25,6 +25,7 @@ CREATE TABLE `goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`goods_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
`inventory` int(10) NOT NULL COMMENT '库存',
`version` int(11) DEFAULT '1',
PRIMARY KEY (`id`),
KEY `inventory` (`inventory`),
KEY `aa` (`id`,`inventory`)
Expand All @@ -34,7 +35,7 @@ CREATE TABLE `goods` (
-- Records of `goods`
-- ----------------------------
BEGIN;
INSERT INTO `goods` VALUES ('1', '测试商品', '1');
INSERT INTO `goods` VALUES ('1', '测试商品', '1', '1');
COMMIT;

-- ----------------------------
Expand All @@ -48,6 +49,6 @@ CREATE TABLE `orders` (
`goods_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
`create_time` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;

0 comments on commit 210111f

Please sign in to comment.