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'=>'添加成功'];

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

应该是事务没有提交

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

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

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

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

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

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

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

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

2年前 评论

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

2年前 评论

log 记录下执行的 sql

2年前 评论

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

2年前 评论

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

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