laravel7+swoole insert数据的一个奇葩问题

1. 运行环境

linux

1). 当前使用的 Laravel 版本?

Laravel 7

2). 当前使用的 php 版本?

PHP 版本:7.4

2. 问题描述?

这里有一个很奇葩的问题,使用swoole情况下,如果env的APP_DEBUG=true的情况下,凡是插入数据库的数据,没有实际插入到数据库,但是那些select的语句是正常的看到新的数据,如果重启swoole,那边这些数据就会被清空。
有没有大佬能解释一下

$CategoryModel = new Category();
$insert['name'] = $post['name'];
$insert['status'] = $post['status'];
$insert['sort'] = $post['sort']??0;
$insert['addtime'] = time();
$id = $CategoryModel->insertGetId($insert);
$this->log($id,"添加类型:".$post['name']);
return ['error'=>0,'msg'=>'添加成功'];

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

你这个属于很常见的长连接问题 1、该进场,请求了一个接口,开启了事务,但是报错了,导致事务没有回滚或提交 2、后续请求,也是该进场处理,会导致,进程内上一个事务没结束,开启了下一个,也就是事务嵌套,提交成功,也就是嵌套事务其中一个提交了,也算入库了,但是你用软件是看不到的,因为外层还有一个事务没提交 3、下次请求,继续该进程,也就是你还在这个事务中,也就是你能查到当前事务的数据(也就是上一次请求的数据) 4、这就是很简单的长连接事务问题

1年前 评论
pi_phq 1年前
panqihuan (作者) 1年前
讨论数量: 17

应该是事务没有提交

1年前 评论
keithhzw (楼主) 1年前

不是很明白 “没有实际插入到数据库,但是那些 select 的语句是正常的看到新的数据“ 如果没写进去select怎么能看到新的记录

1年前 评论
keithhzw (楼主) 1年前
mowangjuanzi 1年前
da_house

麻烦贴一下关键部分代码如:执行数据插入部分代码。感觉是没有commit

1年前 评论
keithhzw (楼主) 1年前
xiaopi

数据库是不是myisam类型的,不支持事务

1年前 评论
keithhzw (楼主) 1年前

用可视化工具之类的看一下有没有数据呗,没有就说明是代码开启了事务

1年前 评论

确认下测试逻辑,查询的时候是怎么查询的?orm查询还是其他方式?

1年前 评论

log记录下执行的sql

1年前 评论

我大概找到原因了,因为mysql有一个wait_timeout 默认是8小时,如果超过这个时间,mysql会把这个连接杀掉,所以使用了swoole保持了连接,但是mysql已经杀掉了线程。 这种情况,没找到很好的解决办法,只能写一个定时计划,保持swoole的连接了 如果觉得不是这个问题或者有更好的解决办法请回复

1年前 评论

你这个属于很常见的长连接问题 1、该进场,请求了一个接口,开启了事务,但是报错了,导致事务没有回滚或提交 2、后续请求,也是该进场处理,会导致,进程内上一个事务没结束,开启了下一个,也就是事务嵌套,提交成功,也就是嵌套事务其中一个提交了,也算入库了,但是你用软件是看不到的,因为外层还有一个事务没提交 3、下次请求,继续该进程,也就是你还在这个事务中,也就是你能查到当前事务的数据(也就是上一次请求的数据) 4、这就是很简单的长连接事务问题

1年前 评论
pi_phq 1年前
panqihuan (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!