php+odbc能实现事务进行高并发下单,防止库存不足?怎样把mysql换成odbc

php+odbc能实现事务进行高并发下单,防止库存不足?怎样把mysql换成odbc
<?php

$conn=mysql_connect("localhost","big","123456");

if(!$conn){

echo "connect failed";

exit;

}

mysql_select_db("big",$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);

}

//模拟下单操作

//库存是否大于0

mysql_query("BEGIN"); //开始事务

$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE";//此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行

$rs=mysql_query($sql,$conn);

$row=mysql_fetch_assoc($rs);

if($row['number']>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('库存减少成功');  
    mysql_query("COMMIT");//事务提交即解锁  
}else{    
    insertLog('库存减少失败');  
}  

}else{

insertLog('库存不够');

mysql_query("ROLLBACK");

}

?>

-- 数据库: 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

2个回答

0

我也看过odbc的使用文档,当使用odbc做事务不行,会有警告:Warning: odbc_do() [function.odbc-do]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]�� 1 ��: 'BEGIN' �������﷨������, SQL state 37000 in SQLExecDirect in D:\web\weChat\worker\updateshoping.php on line 107 Warning: odbc_do() [function.odbc-do]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]�� READ ONLY �α��ϲ���ָ�� FOR UPDATE��, SQL state 37000 in SQLExecDirect in D:\web\weChat\worker\updateshoping.php on line 106

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Mysql在高并发情况下,防止库存超卖而小于0的解决方案
背景: 本人上次做申领campaign的PHP后台时,因为项目上线后某些时段同时申领的人过多,导致一些专柜的存货为负数(),还好并发量不是特别大,只存在于小部分专柜而且一般都是-1的状况,没有造成特别特别严重的后果,但还是要反思了自己的过错。   这次又有新的申领campaign,我翻看了上次的代码逻辑: 正文: 【先select后update】 begi
高并发下减库存操作避免超卖(转)
高并发下减库存操作避免超卖   在秒杀系统中,有100个请求过来下单,减库存操作   方式一: for update 用时5504 select * from PPTEST.TBL_SHOP mm where ID=#{id,jdbcType=VARCHAR} for update select for update这是数据库行锁,也是我们常用的悲观锁,可用于针对某商品的秒杀操作,但是...
mysql处理高并发,防止库存超卖(订单系统库存解决方案)
MySQL处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过;但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识。今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点。 先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存肯定是
MySQL处理高并发,防止库存超卖库存出现负数
mysql处理高并发的方式比较多,以下为比较简单的一种(mysql事物控制)beginTranse();try{$result = $dbca-&amp;gt;query('select amount from s_store where postID = 12345');if(result-&amp;gt;amount &amp;gt; 0){//quantity为请求减掉的库存数量$dbca-&amp;gt;query('u...
商城系统下单库存管控系列杂记(一)(并发安全和性能基础认识)
转载:http://www.cnblogs.com/bsfz/p/7801980.html 前言 参与过几个中小型商城系统的开发,随着时间的增长,以及对系统的深入研究和测试,发现确实有很多值得推敲和商榷的地方(总有很多重要细节存在缺陷)。基于商城系统,无论规模大小,或者本身是否分布架构,个人觉得最核心的一环就是下单模块,而这里面更相关和棘手的一些设计和问题,大多时候都涉及库存系统。想
防止负库存方案小总结
  一、直接操作数据库,SQL如下: update t_warehouse_material set count = (count- 10)  where warehouse_number ='center_sh' and material_number='Y21002' and batch_number='p_20170822_2' and count&amp;gt;=10 ...
php解决下单、抽奖并发导致的库存负数的问题
转载地址:点击打开链接 我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的: sql1:查询商品库存 if(库存数量 > 0) {     //生成订单...     sql2:库存-1 } 当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变
ODBC:事务
ODBC事务相关知识
ODBC之事务处理OdbcTransaction的使用
在网上查了下,很少关于ODBC的事务处理方面的相关文章,写出来做个笔记。OdbcConnection odbcConn = new OdbcConnection(ODBC连接字符串);odbcConn.Open();OdbcTransaction trans = odbcConn.BeginTransaction();try{      OdbcCommand cmd = new OdbcComm...
电商系列---mysql高并发超库存卖问题
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。 从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件
php 使用msyql 行锁防止高并发请求时扣库存异常 【防爆单,超卖】
//假设用户 $uid 购买 good_id 号商品 $amount 份。 $uid = rand(1,10); $amount = rand(1,5); $goods_id = rand(1,6); $time = time(); //简单实现。 //1 查询商品库存 ,求出此商品剩余库存数。 ...
mysql 高并发,防止库存刷爆
【先select后update】 beginTranse(开启事务) try{     $result = $dbca->query('select amount from s_store where postID = 12345');     if(result->amount > 0){         $dbca->query('update s_store
项目中并发下单的问题怎么解决?
解决方法肯定是用文件锁了,具体怎么做看数据库区的mysql模块下的mysql锁。 使用文件锁,先试试有没有其他方法,具体如下。 背景知识:数据库存储引擎、表锁、文件锁。 数据库存储引擎: 如果是mysiam引擎,则它的锁只能支持表锁,所以要操作这个表的功能,都会被阻塞。这样做会拖慢整个网站的网速。 举个例子: 比如:我们下订单时,要锁定商品表,那么网站下订单的人非常多,那么商品表就
mysql处理高并发,防止库存超卖,秒杀活动
转自:http://blog.csdn.net/caomiao2006/article/details/38568825 今天王总又给我们上了一课,其实MySQL处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过;但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识。今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点。 先来就库存超卖的问题作
php并发情况下防止商品库存超库存|秒杀问题解决方案
优化方案1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false 优化方案2:使用mysql的事务,锁住操作的行(等待) 优化方案3:使用非阻塞的文件排他锁 [点击查看:用文件锁排他锁实现商品秒杀、抢购] (https://blog.csdn.net/lenovo403/article/details/50722734) 优化方案4:使用...
解决并发情况下库存减为负数问题
解决并发情况下库存减为负数问题
高并发处理【电商抢购】
$conn=mysql_connect("localhost","big","123456");    if(!$conn){        echo "connect failed";        exit;    }   mysql_select_db("big",$conn);   mysql_query("set names utf8");    $price=10;  $user_id
PHP(结合redis,事物和锁)解决高并发下抢购
&amp;lt;?php/** 抢购模块*/class seckill extends common { private $_orderModel = null; private $_goodsModel = null; private $_redis = null; protected $_error = ''; public function __construct() { if($...
高并发下减库存操作避免超卖
在秒杀系统中,有100个请求过来下单,减库存操作 方式一: for update 用时5504 select * from PPTEST.TBL_SHOP mm where ID=#{id,jdbcType=VARCHAR} for update select for update这是数据库行锁,也是我们常用的悲观锁,可用于针对某商品的秒杀操作,但是当出现主键索引和非主键索引同时等待
淘宝下单部分高并发设计 的个人理解
要优化下单就要提高TPS (Transaction per second)每秒下单数,我们首先要做的是对下单的逻辑剥离,只保留核心部分,而把附加功能剔除出去。     比如说下单要考虑库存量,考虑发短信,要给卖家发旺旺消息通知,要对订单做统计,要做销售额统计等等,这些功能是必要的,但是也是附加的功能,要最大程度提高下单这一步的TPS,就要先不考虑这些东西。     下单的核心是买家查看
mysql 针对高并发下,同时修改单条数据发生冲突导致数据错误的问题(例如:高并发下单,导致库存为负数)
毕业后第一次做的项目就是电商,但是当时也不明白这个问题。 所以给自己埋下一个坑。 先说说当初的做法,和遇到的问题。 //开启事务 start transaction; //查询库存 select number from item where id = 1; //如果大于购买数量进入购买,如果小于返回错误 并rollback //进入购买 update item set item
秒杀(高并发)库存超卖 mysql和redis如何避免
https://blog.csdn.net/caomiao2006/article/details/38568825 https://blog.csdn.net/xiaolyuh123/article/details/79208959 https://juejin.im/entry/5964bcd851882568b20dbd73 大概查了一些解决方案,r...
PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法
如今在电商行业里,秒杀抢购活动已经是商家常用促销手段。但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题。 又比如:抢购火车票、论坛抢楼、抽奖乃至爆红微博评论等也会引发阻塞式高并发问题。如果不做任何措施可能在高瞬间造成服务器瘫痪,如何解决这个问题呢? 这里提出个人认为比较可行的几个思路方法: 方案一:使用消息队列来实现 可以基于例如MemcacheQ
一个简单的分布式事务系统的实现(订单系统)
背景:公司最早的一个版本的订单管理,是通过PHP+mysql的方案去实现的,这样会有什么问题呢,假设如果放到一个实例里面,全部用一个单机事务去解决,这样是能比较方便的解决数据一致性问题。但是,无法进行多实例部署,用户量增长以后,无法快速应对,这是第一个版本。之后,我们推出了第二个版本V2,这个版本的时候,我们已经开发好了,库存管理系统,优惠券管理系统,PHP中,已经不直接通过DB去修改库存和优惠券
高并发核心技术,订单与库存--如何防止超发,少发?
参考链接:http://jblog.top/article/details/255453解决方案:采用redis事务控制。如果直接用redis的incr、decr等命令,个人理解就是将数据库的压力前移到了redis,仅仅是提升了性能,没有从根本上解决问题。如果在获取库存后,假设有一系列操作,最后再执行incr,decr命令,一样可能出现超卖情况。...
事务隔离机制原理分析以及是否可以防止订单超卖
事务的隔离机制是指: Read Uncommitted(读取未提交内容) Read Committed(读取提交内容) Repeatable Read(可重读) Serializable(可串行化) 具体的解释最经典的MySQL书《高性能MySQL(第3版)》以及有了就不在其他地方再引用了: 隔离机制的比较 其实也有人喜欢用锁来控制并发,书中还提到了“隐式”和
php 高并发解决(商城抢购问题2)
方案一:使用消息队列来实现 可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧 比如有100张票可供用户抢,那么就可以把这100张票放到缓存中,读写时不要加锁。 当并发量大的时候,可能有500人左右抢票成功,这样对于500后面的请求可以直接转到活动结束的静态页面。进去的500个人中有400个人是不可能获得商品的。所以可以根据进入队列的先后顺序只能前100个人购买成功。
秒杀事务高并发问题
高并发优化  本身Mysql数据处理事务能力并没有问题,一条update压力测试约4wQPS(同一个id执行update),那么在java控制事务的时候,就会变成一个串行结构,会造成大量的阻塞操作,那么下面对这些等待分析原因:        主要瓶颈是在客户端执行update时,发送sql语句到数据库,期间会有网络延迟*,GC*(jvm垃圾回收机制)操作,这两个是主要问题,    当这个逻辑执行完...
php+redis实现高并发下的抢购、秒杀功能
抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少(&quot;超卖&quot;问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。重点在于第二个问题常规写法:查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数[php...
高并发下的库存减少问题(微信支付)
前段时间,在做一个网上商场的项目。在做秒杀模块时候,遇到一个棘手的问题。就是我设置的秒杀活动的库存,总是莫名其妙的减少了。我是把减库存放在微信支付的成功回调里面的。 查询资料发现,原来微信支付成功之后微信服务器会发送8次请求到回调地址。这样我这样的做法就会导致库存减少。 微信支付回调会返回微信生成的订单号以及我们自己生成的订单号。 我的逻辑是这样的,通过他返回的我们自己生成的订单号去数据库查...
javascript连接mysql与php通过odbc连接任意数据库
脑洞大开用javascript链接mysql,2个小时总算实现了,用到了odbc,后面又想到用php链接odbc链接数据库,也实现了,就把案例放一下。 注意事项: 1.javascript连接mysql使用的是”new ActiveXObject“这个对象,这个对象只有IE浏览器支持,所以只能在IE浏览器下实现连接mysql。 2.javascript也是通过odbc连接mysql,和php
如何保证高并发下库存不会被扣为负数
我面试被问到的时候有点懵,因为之前的业务都没有涉及到这个,我回答的是加锁,后面我看过其他人的回答后,总结了几种方法 1.数据库乐观锁 加一个字段版本号 扣库存的时候判断一下版本号 2.把库存字段改为unsigned 这样可以保证库存不为负数,如果并发情况下被扣为负数的时候会报错,这个时候try catch然后返回库存不足就可以了 3.用redis的List数据类型 把所有秒杀请求插入...
php的mysql事务处理,针对高并发
PHP与MYSQL事务处理 /* MYSQL的事务处理主要有两种方法。 1、用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2、直接用set来改变mysql的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 set autocommit=0
MySQL或Oracle通过ODBC与C#建立连接和进行事务处理
1.通过ODBC使C#能够对MySQL数据进行访问,并可以进行事务处理。 2.通过ODBC使C#能够对Oracle数据进行访问,并可以进行事务处理。 3.文档里面包含了环境配置,软件安装的全过程。最后包含了可执行的数据库连接共同的C#代码提供参考。
用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景?
首先,我们一起来看看这个问题的背景? 前段时间有个朋友在外面面试,然后有一天找我聊说:有一个国内不错的电商公司,面试官给他出了一个场景题: 假如下单时,用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景? 他说他当时没答上来,因为没做过没什么思路。其实我当时听到这个面试题心里也觉得有点意思,因为如果是我来面试候选人的话,应该会给的范围更大一些 比...
ODBC方式连接MySQL7.9 及配置DSN教程
VS2008用ODBC方式连接MySQL7.9配置步骤及配置DSN相关步骤,一步到位的图文教程。
mysql触发器解决购物中订单爆仓问题
在购物流程中,我们经常会碰到购物订单超过商品数量的问题,一般我们可以根据商品数量在程序上进行控制,我们今天来看一下,利用mysql触发器如何进行商品数量与订单数量的控制。 (1)我们先来一下商品goods和订单表ord中的数据: (2)创建触发器: (3)执行“ insert into ord values (1,3,25) ”(购买pig商品25个,
php mysql 防并发加锁事务处理
1、背景: 现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz’的记录。 2、一般程序逻辑如下: $conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error());
PHP学习之JDBC与ODBC的区别与实际运用,PHP ODBC
JDBC与ODBC都可以实现类似的功能,但JDBC与ODBC的区别是他们的开发架构不同,其实现细节上也有所差异。         谈到JDBC与ODBC的区别,JDBC和ODBC其实都是用来连接数据库的启动程序。ODBC中文姓名叫做开放数据库互联,是 Microsoft性能开发的开放服务框架中有关数据库的一个的组成部份,它建立一组有关的规则,并帮助了一组对数据库访问的达标实际运用程序编
高并发场景,实现一个判断库存并扣减库存的功能
我理解是防止超卖的一个场景,由于这块是高并发的场景下,频繁操作数据库,会造成性能问题,这块分两部分处理,一部分是从业务层控制冻结库存,从理财货架选择商品点击申购后,跳到收银台提交支付,在提交支付的动作里面进行剩余份额确认,当前我们是进行缓存查询,查询当前的剩余份额&amp;gt;申购份额时,则把这部分份额进行冻结处理,然后首先保证前端显示的剩余库存已被减掉,防止超卖。等支付成功之后,再把真实份额减掉,如...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java怎样能快速学习 怎样能快速学习java