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,一经查实,立即删除!

相关文章

中国电信天翼云进入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;被业内誉为打破“数据隐私…

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;一系列的配料遵照严格的顺序倒入搅拌盘里混合并产生特殊效应。想做出蛋糕心松软、湿润和细腻质感的黄…

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

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

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

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

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

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

实时计算 Flink 版总体介绍

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

来电科技:基于Flink+Hologres的实时数仓演进之路

简介&#xff1a; 本文将会讲述共享充电宝开创企业来电科技如何基于FlinkHologres构建统一数据服务加速的实时数仓 作者&#xff1a;陈健新&#xff0c;来电科技数据仓库开发工程师&#xff0c;目前专注于负责来电科技大数据平台离线和实时架构的整合。 深圳来电科技有限公司&…

你说精通 Redis ,你看过持久化的配置吗?

作者 | 阿Q来源 | 阿Q说代码今天让我们从理论和配置两个层面来揭开Redis持久化的神秘面纱。所谓持久化可以简单理解为将内存中的数据保存到硬盘上存储的过程。持久化之后的数据在系统重启或者宕机之后依然可以进行访问&#xff0c;保证了数据的安全性。Redis有两种持久化方案&a…

matlab from有什么用,Matlab函数使用'fromworkspace'将向量传递给simulink

我想编写一个包含simulink块的matlab函数 . 该函数应将数据加载到simulink模型中&#xff0c;运行它&#xff0c;然后从函数返回数据 .我能想到的唯一方法就是在simulink中使用To Workspace和From Workspace块 . 问题是From Workspace块不从功能范围中获取变量&#xff0c;只从…

一种低延迟的超时中心实现方式

简介&#xff1a; 在很多产品中都存在生命周期相关的设计&#xff0c;时间节点到了之后需要做对应的事情。超时中心&#xff08;TimeOutCenter&#xff0c;TOC&#xff09;负责存储和调度生命周期节点上面的超时任务&#xff0c;当超时任务设置的超时时间到期后&#xff0c;超时…

浪潮云海OpenStack X版本技术贡献中国第一

10月6日&#xff0c;OpenStack社区发布第24个版本 Xena&#xff08;简称X版本&#xff09;&#xff0c;浪潮云海在Nova、Cyborg、Cinder、Masakari、Manila等核心项目的技术贡献排名再次获得「中国第一」、全球前三&#xff0c;已连续4个版本荣登社区技术贡献国内榜首&#xff…