fu14718118862 2016-11-11 01:25 采纳率: 0%
浏览 365
已结题

lock.txt,中应该有什么内容才能做到只能一个线程访问数据库中一个事务

怎样才能防止多个用户同时下单,库存不足,也就说多个用户访问数据库只能一个用户提交完成后,另一个才能提交订单;内容出自: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);

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题