网上书城网站开发的结论和不足,昆明制作网站公司,石家庄做网站哪家公司好,饰品网站模板用实例代码给大家介绍关于php多进程模拟并发事务产生的一些问题#xff0c;分享出来供大家参考学习#xff0c;下面话不多说了#xff0c;来一起看看详细的介绍吧数据表drop table if exists test;create table if not exists test (id int not null auto_increment ,count …用实例代码给大家介绍关于php多进程模拟并发事务产生的一些问题分享出来供大家参考学习下面话不多说了来一起看看详细的介绍吧数据表drop table if exists test;create table if not exists test (id int not null auto_increment ,count int default 0 ,primary key id (id)) engineinnodb character set utf8mb4 collate utf8mb4_bin comment 测试表;insert into test (count) values (100);// 进程数量$pro_count 100;$pids [];for ($i 0; $i $pro_count; $i){$pid pcntl_fork();if ($pid 0) {// 主进程throw new Exception(创建子进程失败: . $i);} else if ($pid 0) {// 主进程$pids[] $pid;} else {// 子进程try {$pdo new PDO(...);$pdo-beginTransaction();$stmt $pdo-query(select count from test);$count $stmt-fetch(PDO::FETCH_ASSOC)[count];$count intval($count);if ($count 0) {$count--;$pdo-query(update test set count . $count . where id 2);}$pdo-commit();} catch(Exception $e) {$pdo-rollBack();throw $e;}// 退出子进程exit;}}期望的结果期望 count 字段减少的量超过 100变成负数也就是多减实际结果并发 200 的情况下运行多次后的结果分别如下1. count 652. count 753. count 554. count 84...与期望结果相差甚远为什么会出现这样的现象呢解释首先清楚下目前的程序运行环境并发场景。何为并发几乎同时执行称之为并发。具体解释如下进程 过程 获取 更新1-40 同时创建并运行 100 9941-80 同时创建并运行 99 9881 - 100 同时创建并运行 98 97对上述第一行做解释第 1-40 个子进程的创建几乎同时运行也几乎同时进程 1 获取 count 100更新 99进程 2 获取 count 100更新 99...进程 40 获取 count 100更新 99所以实际上这些进程都做了一致的操作并没有按照预期的那样进程1 获取 count100更新 99进程 2 获取进程1更新后的结果 count99更新98...进程 99 获取进程 98更新后的结果count1更新0产生的现象就是少减了结论采用上述做法实现的程序库存总是 0。疑问那要模拟超库存的场景该如何设计程序呢仍然采用上述代码将以下代码if ($count 0) {$count--;$pdo-query(update test set count . $count . where id 2);}修改成下面这样if ($count 0) {$pdo-query(update test set count count - 1 where id 2);}结果就会出现超库存库存 100并发 200最终库存减少为 -63。为什么会出现这样的情况呢以下描述了程序运行的具体过程进程 1 获取库存 100更新 99进程 2 获取库存 100更新 98(99 - 1)进程 3 获取库存 100更新 97(98 - 1)....进程 168 获取库存 1 更新 0(1-1)进程 169 获取库存 1 更新 -1(0 - 1)进程 170 获取库存 1 更新 -2(-1 - 1)....进程 200 获取库存 1更新 -63(-62 - 1)现在看来很懵逼实际就是下面这条语句导致的$pdo-query(update test set count count - 1 where id 2);这边详细阐述 进程 1简称 a进程 2简称 b 他们具体的执行顺序1. a 查询到库存 1002. b 查询到库存 1003. a 更新库存为 99(100 - 1)这个应该秒懂4. b 更新库存为 98(99 - 1)- b 在执行更新操作的时候拿到的是 a 更新后的库存- 为什么会这样因为更新语句是 update test set count count - 1 where id 2以上内容希望帮助到大家很多PHPer在进阶的时候总会遇到一些问题和瓶颈业务代码写多了没有方向感不知道该从那里入手去提升对此我整理了一些资料包括但不限于分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6laravelRedisSwoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家需要戳这里PHP进阶架构师实战视频、大厂面试文档免费获取