usleep延时0.毫秒_【进阶】用swoole实现订单的延时处理(自动取消,还原库存等)...

93accc0e0d95d1160ad439213c0bdf6d.png

文章正文

2d1aec73bf66c6cfbee8d87cb9a0d6da.png

一、业务场景:当客户下单在指定的时间内如果没有付款,那我们需要将这笔订单取消掉,比如好的处理方法是运用延时取消,很多人首先想到的当然是crontab,这个也行,不过这里我们运用swoole的异步毫秒定时器来实现,同样也不会影响到当前程序的运行,具体可以参考:https://wiki.swoole.com/wiki/page/319.html

二、说明,order_status为1时代表客户下单确定,为2时代表客户已付款,为0时代表订单已取消(正是swoole来做的)

三、举例说明,库存表csdn_product_stock产品ID为1的产品库存数量为20,产品ID为2的库存数量为40,然后客户下单一笔产品ID1减10,产品ID2减20,所以库存表只够2次下单,例子中10秒后自动还原库存,如下图:

图解:1、第一次下完单产品ID1库存从20减到了10,产品ID2库存从40减到了20;2、第二次下完单产品ID的库存为0了,产品ID2的库存也为0了,3、第三次下单时,程序提示Out of stock;4、过了10秒钟(每个订单下单后往后推10秒),客户两次下单,由于没有付款(csdn_order表的order_status为1),产品1和产品2的库存被还原了(csdn_order表的order_status变为0),客户又可以继续下单了

410b8fea58b20ef4717732d936d5e19f.gif

1、所需要sql数据库表

DROP TABLE IF EXISTS `csdn_order`;CREATE TABLE `csdn_order` ( `order_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_amount` float(10,2) unsigned NOT NULL DEFAULT '0.00', `user_name` varchar(64) CHARACTER SET latin1 NOT NULL DEFAULT '', `order_status` tinyint(2) unsigned NOT NULL DEFAULT '0', `date_created` datetime NOT NULL, PRIMARY KEY (`order_id`)) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `csdn_order_detail`;CREATE TABLE `csdn_order_detail` ( `detail_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order_id` int(10) unsigned NOT NULL, `product_id` int(10) NOT NULL, `product_price` float(10,2) NOT NULL, `product_number` smallint(4) unsigned NOT NULL DEFAULT '0', `date_created` datetime NOT NULL, PRIMARY KEY (`detail_id`), KEY `idx_order_id` (`order_id`)) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `csdn_product_stock`;CREATE TABLE `csdn_product_stock` ( `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) NOT NULL, `product_stock_number` int(10) unsigned NOT NULL, `date_modified` datetime NOT NULL, PRIMARY KEY (`auto_id`), KEY `idx_product_id` (`product_id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO `csdn_product_stock` VALUES ('1', '1', '20', '2018-09-13 19:36:19');INSERT INTO `csdn_product_stock` VALUES ('2', '2', '40', '2018-09-13 19:36:19');

下面贴出来纯手工PHP,很多同学用了原生PHP,就不会运用到框架里去,其实都一样的,不要想得那么复杂就是了。只要一点就是你用多了,你就会这样觉得咯。

配置文件config.php ,这个在框架的话,基本上都是配置好了。

<?php $dbHost = "192.168.23.110";$dbUser = "root";$dbPassword = "123456";$dbName = "test";?>

swoole都是用在linux系统里的,这里的host你可以自己搭建虚拟主机,也可以网上购买属于自己的服务器

订单提交的文件order_submit.php,这里对订单生成,同时扣除库存的一系列操作

<?phprequire ("config.php");try { $pdo = new PDO("mysql:host=" . $dbHost . ";dbname=" . $dbName, $dbUser, $dbPassword, array(PDO::ATTR_PERSISTENT => true)); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $orderInfo = array( 'order_amount' => 10.92, 'user_name' => 'yusan', 'order_status' => 1, 'date_created' => 'now()', 'product_lit' => array( 0 => array( 'product_id' => 1, 'product_price' => 5.00, 'product_number' => 10, 'date_created' => 'now()' ), 1 => array( 'product_id' => 2, 'product_price' => 5.92, 'product_number' => 20, 'date_created' => 'now()' ) ) ); try{ $pdo->beginTransaction();//开启事务处理 $sql = 'insert into csdn_order (order_amount, user_name, order_status, date_created) values (:orderAmount, :userName, :orderStatus, now())'; $stmt = $pdo->prepare($sql);  $affectedRows = $stmt->execute(array(':orderAmount' => $orderInfo['order_amount'], ':userName' => $orderInfo['user_name'], ':orderStatus' => $orderInfo['order_status'])); $orderId = $pdo->lastInsertId(); if(!$affectedRows) { throw new PDOException("Failure to submit order!"); } foreach($orderInfo['product_lit'] as $productInfo) { $sqlProductDetail = 'insert into csdn_order_detail (order_id, product_id, product_price, product_number, date_created) values (:orderId, :productId, :productPrice, :productNumber, now())'; $stmtProductDetail = $pdo->prepare($sqlProductDetail);  $stmtProductDetail->execute(array(':orderId' => $orderId, ':productId' => $productInfo['product_id'], ':productPrice' => $productInfo['product_price'], ':productNumber' => $productInfo['product_number'])); $sqlCheck = "select product_stock_number from csdn_product_stock where product_id=:productId";  $stmtCheck = $pdo->prepare($sqlCheck);  $stmtCheck->execute(array(':productId' => $productInfo['product_id']));  $rowCheck = $stmtCheck->fetch(PDO::FETCH_ASSOC); if($rowCheck['product_stock_number'] < $productInfo['product_number']) { throw new PDOException("Out of stock, Failure to submit order!"); } $sqlProductStock = 'update csdn_product_stock set product_stock_number=product_stock_number-:productNumber, date_modified=now() where product_id=:productId'; $stmtProductStock = $pdo->prepare($sqlProductStock);  $stmtProductStock->execute(array(':productNumber' => $productInfo['product_number'], ':productId' => $productInfo['product_id'])); $affectedRowsProductStock = $stmtProductStock->rowCount(); //库存没有正常扣除,失败,库存表里的product_stock_number设置了为非负数 //如果库存不足时,sql异常:SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in '(`test`.`csdn_product_stock`.`product_stock_number` - 20)' if($affectedRowsProductStock <= 0) { throw new PDOException("Out of stock, Failure to submit order!"); } } echo "Successful, Order Id is:" . $orderId .",Order Amount is:" . $orderInfo['order_amount'] . "。"; $pdo->commit();//提交事务 //exec("php order_cancel.php -a" . $orderId . " &"); pclose(popen('php order_cancel.php -a ' . $orderId . ' &', 'w')); //system("php order_cancel.php -a" . $orderId . " &

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

boa php5.5 移植,BOA+PHP在Tiny6410上的移植

1、下载php-5.2.17.tar.bz22、解压到/vptemp#tar -jxv -f php-5.2.17.tar.bz2 -C /vptemp3、编译# cd /vptemp/php-5.2.17#CCarm-linux-gcc ./configure --hostarm-linux --prefix/opt/php5 --disable-all --enable-pdo --with-sqlite3 --with-sqlite --with-pdo-sqlite --with…

中国电信天翼云进入4.0阶段,打造一朵无处不在的分布式云

11月12日&#xff0c;天翼云在2021国际数字科技展暨天翼智能生态博览会天翼云论坛上&#xff0c;发布并解读了全新升级的天翼云4.0分布式云&#xff0c;同时还推出了以红色为主色调的天翼云全新品牌形象。 天翼云新品牌形象 中国电信集团有限公司副总经理唐珂在致辞中表示&am…

软件开发中 前台、中台、后台英文_最近处处惹人爱的中台到底是什么

在当下互联网圈子里要问什么最火莫过于中台这一概念了&#xff0c;各大公司都开始了一轮跑马圈地似的中台建设&#xff0c;那么到底中台是什么呢&#xff1f;本文我们就来谈谈这个话题。一、什么是前台&#xff0c;后台在以往的互联网企业生产流程中&#xff0c;我们可以将研发…

如何基于MaxCompute快速打通数据仓库和数据湖的湖仓一体实践

简介&#xff1a; MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库&#xff0c;以 Serverless 架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用户运维投入&#xff0c;使您可以经济并高效的分析处…

数仓架构的持续演进与发展 — 云原生、湖仓一体、离线实时一体、SaaS模式

简介&#xff1a; 数据仓库概念从1990年提出&#xff0c;经过了四个主要阶段。从最初的数据库演进到数据仓库&#xff0c;到MPP架构&#xff0c;到大数据时代的数据仓库&#xff0c;再到今天的云原生的数据仓库。在不断的演进过程中&#xff0c;数据仓库面临着不同的挑战。 作…

华为路由器命令手册_华为路由器+蒲公英路由器,如何做双层路由器映射?

今天上午&#xff0c;有一个客户反馈&#xff0c;他们的软件和linux系统无法实现外网访问了。客户的网络拓扑是这样的&#xff0c;光猫接蒲公英路由器X5&#xff0c;蒲公英路由器的LAN 口IP是192.168.0.1&#xff0c;然后从蒲公英路由器的LAN口连接一根网线到华为路由器WAN口&a…

行业务实派:解锁数据价值,翼方健数全栈隐私安全计算技术

数智化时代&#xff0c;数据已成为最核心、最具价值的生产要素。其中&#xff0c;如何应用可落地的技术&#xff0c;共享和保护数据&#xff0c;促进数据要素进一步流通&#xff0c;释放数据价值&#xff0c;受到业内普遍关注。 隐私计算&#xff0c;被业内誉为打破“数据隐私…

css中分区显示php,CSS中7个你必须知道属性

学习CSS是构建好看网页的一种方式。 但是&#xff0c;在学习过程中&#xff0c;我们倾向于(大部分时间)限制自己&#xff0c;一遍又一遍地使用相同的属性。 毕竟&#xff0c;我们是一种习惯性的动物&#xff0c;我们会使用自己习惯且熟悉的东西。因此&#xff0c;在这篇文章中&…

ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字

这周基本啥也没发&#xff0c;传个小游戏吧就&#xff5e;点赞(150) 投币(随缘)推荐用用吉里吉里模拟器玩&#xff5e;应该是女仆类的游戏&#xff0c;我没玩过也不清楚哦链接失效我就不补了&#xff0c;如果点赞在今天内达标&#xff0c;那就今晚20:00补发&#xff0c;不要错…

浅谈分布式一致性:Raft 与 SOFAJRaft

简介&#xff1a; SOFAJRaft已开源 作者 | 家纯 来源 | 阿里技术公众号 一 分布式共识算法 (Consensus Algorithm) 1 如何理解分布式共识? 多个参与者针对某一件事达成完全一致&#xff1a;一件事&#xff0c;一个结论。 已达成一致的结论&#xff0c;不可推翻。 2 有哪些…

OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能

简介&#xff1a; OpenKruise 是阿里云开源的云原生应用自动化管理套件&#xff0c;也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀&#xff0c;是阿里内部生产环境大规模应用的基于 Kubernetes 之…

00后确实卷,公司新来的卷王,我们这帮老油条真干不过.....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最…

rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因

其实这些问题的答案大多都隐藏在搅拌盘、烤炉和烤盘中掌握好这些基础知识就能告别这些常见的失误01﹏﹏﹏好的蛋糕始于搅拌盘做蛋糕的过程实质上是化学变化的过程&#xff0c;一系列的配料遵照严格的顺序倒入搅拌盘里混合并产生特殊效应。想做出蛋糕心松软、湿润和细腻质感的黄…

日期 java cal,日期系列教材 (三)- 如何使用Java的Calendar类

代码比较复制代码package date;import java.text.SimpleDateFormat;//import java.util.Calendar;import java.util.Date;public class TestDate {private static SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(Strin…

阿里云资深技术专家李克畅谈边缘云计算趋势与实践

简介&#xff1a; 2021年5月15日&#xff0c;以“相信边缘的力量”为主题的全球边缘计算大会在深圳成功召开。 阿里云资深技术专家李克&#xff0c;分享阿里云在边缘云计算的探索和实践&#xff0c;如何为行业提供广覆盖、低成本、高可靠的边缘基础设施。 2021年5月15日&#…

python编写程序接收字符串_Python字符串操作

a Hellob Python一、字符串运算符1.字符串连接()字符串1 ‘字符串2’>>>print(a b)HelloPython2.重复输出字符串(*)字符串 * n>>>print(a * 2)HelloHello3.通过索引获取目标字符([])索引从0开始。>>>print(a[1])e4.切片&#xff0c;截取字符串(…

阿里云江岑:云原生在边缘形态下的升华

简介&#xff1a; 5月20-22日&#xff0c;第十三届中国系统架构师大会&#xff08;SACC2021&#xff09;在云端进行网络直播&#xff0c;主题为“数字转型、架构重塑”。阿里云边缘云原生技术专家江岑&#xff0c;分享了阿里云在边缘云原生的探索实践&#xff0c;并从应对技术挑…

对数据“投入”却没有“产出”?听听 Gartner 的最新分析

作者 | 宋慧出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;关于数据中台的问题&#xff0c;CSDN 在一年前采访了 Gartner 研究总监孙鑫&#xff0c;采访中&#xff0c;孙鑫提到 数据分析将是改变“游戏规则”的技术、企业的中台需要可组装的架构 。经过一年…

电脑卡在正在启动windows界面_让 Linux 启动更快

进行 Linux 内核与固件开发的时候&#xff0c;往往需要多次的重启&#xff0c;会浪费大把的时间。在所有我拥有或使用过的电脑中&#xff0c;启动最快的那台是 20 世纪 80 年代的电脑。在你把手从电源键移到键盘上的时候&#xff0c;BASIC 解释器已经在等待你输入命令了。对于现…

实时计算 Flink 版总体介绍

简介&#xff1a; 实时计算 Flink 版&#xff08;Alibaba Cloud Realtime Compute for Apache Flink&#xff0c;Powered by Ververica&#xff09;是阿里云基于 Apache Flink 构建的企业级、高性能实时大数据处理系统&#xff0c;由 Apache Flink 创始团队官方出品&#xff0c…