怎样才能防止多个用户同时下单,库存不足,也就说多个用户访问数据库只能一个用户提交完成后,另一个才能提交订单;内容出自:http://blog.csdn.net/nuli888/article/details/51865401
<?php
$conn=mysql_connect("localhost","root","123456");
if(!$conn){
echo "connect failed";
exit;
}
mysql_select_db("big-bak",$conn);
mysql_query("set names utf8");
$price=10;
$user_id=1;
$goods_id=1;
$sku_id=11;
$number=1;
//生成唯一订单号
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function insertLog($event,$type=0){
global $conn;
$sql="insert into ih_log(event,type)
values('$event','$type')";
mysql_query($sql,$conn);
}
$fp = fopen("lock.txt", "w+");
if(!flock($fp,LOCK_EX | LOCK_NB)){
echo "系统繁忙,请稍后再试";
return;
}
//下单
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
$rs=mysql_query($sql,$conn);
$row=mysql_fetch_assoc($rs);
if($row['number']>0){//库存是否大于0
//模拟下单操作
$order_sn=build_order_no();
$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
$order_rs=mysql_query($sql,$conn);
//库存减少
$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
$store_rs=mysql_query($sql,$conn);
if(mysql_affected_rows()){
insertLog('库存减少成功');
flock($fp,LOCK_UN);//释放锁
}else{
insertLog('库存减少失败');
}
}else{
insertLog('库存不够');
}
fclose($fp);
-- 数据库: big
-- 表的结构 ih_goods
CREATE TABLE IF NOT EXISTS ih_goods
(goods_id
int(10) unsigned NOT NULL AUTO_INCREMENT,cat_id
int(11) NOT NULL,goods_name
varchar(255) NOT NULL,
PRIMARY KEY (goods_id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
-- 转存表中的数据 ih_goods
INSERT INTO ih_goods
(goods_id
, cat_id
, goods_name
) VALUES
(1, 0, '小米手机');
-- 表的结构 ih_log
CREATE TABLE IF NOT EXISTS ih_log
(id
int(11) NOT NULL AUTO_INCREMENT,event
varchar(255) NOT NULL,type
tinyint(4) NOT NULL DEFAULT '0',addtime
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- 转存表中的数据 ih_log
-- 表的结构 ih_order
CREATE TABLE IF NOT EXISTS ih_order
(id
int(11) NOT NULL AUTO_INCREMENT,order_sn
char(32) NOT NULL,user_id
int(11) NOT NULL,status
int(11) NOT NULL DEFAULT '0',goods_id
int(11) NOT NULL DEFAULT '0',sku_id
int(11) NOT NULL DEFAULT '0',price
float NOT NULL,addtime
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表' AUTO_INCREMENT=1 ;
-- 转存表中的数据 ih_order
-- 表的结构 ih_store
CREATE TABLE IF NOT EXISTS ih_store
(id
int(11) NOT NULL AUTO_INCREMENT,goods_id
int(11) NOT NULL,sku_id
int(10) unsigned NOT NULL DEFAULT '0',number
int(10) NOT NULL DEFAULT '0',freez
int(11) NOT NULL DEFAULT '0' COMMENT '虚拟库存',
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存' AUTO_INCREMENT=2 ;
-- 转存表中的数据 ih_store
INSERT INTO ih_store
(id
, goods_id
, sku_id
, number
, freez
) VALUES
(1, 1, 11, 500, 0);