首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
MySQL连接池对于同时执行多条语句时产生的异常无法捕获
### 问题描述 MySQL连接池对于同时执行多条语句时产生的异常无法捕获 ### Swoole版本,PHP版本,以及操作系统版本信息 ### 相关代码 ```php $pdo_pool = new PDOPool((new PDOConfig())->withUnixSocket('/tmp/mysql.sock') ->withUsername('test') ->withPassword('123456') ->withDbName('test') ->withCharset('utf8mb4'), 20); $pdo = $pdo_pool->get(); # 建表 SQL $create_table_sql = <<<SQL CREATE TABLE `users` (`name` varchar(4) COLLATE utf8mb4_general_ci NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci SQL; $sql = <<<SQL INSERT INTO `users` (`name`) VALUES ('abcd'); INSERT INTO `users` (`name`) VALUES ('abcde'); SQL; $st = $pdo->prepare($sql); $st->execute(); $st->closeCursor(); ``` 第二个插入语句按照正常情况会报出错误:SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'name' at row 1。如果我用原生的pdo_mysql就会报错,但是用swoole的pdo mysql连接池就会忽略这个错误,trycatch也不能捕获。 但是SQL改变一下顺序 ```php $sql = <<<SQL INSERT INTO `users` (`name`) VALUES ('abcde'); INSERT INTO `users` (`name`) VALUES ('abcd'); SQL; ``` 把错误的语句放到前面,swoole pdo mysql连接池就能捕获到错误了。连接池并非只执行第一句SQL,后面的SQL也会执行,问题出在第二句和以后的SQL若出现错误会被忽略。 ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于2年前 · 22 次浏览 · 来自
提问
Jessica
### 问题描述 MySQL连接池对于同时执行多条语句时产生的异常无法捕获 ### Swoole版本,PHP版本,以及操作系统版本信息 ### 相关代码 ```php $pdo_pool = new PDOPool((new PDOConfig())->withUnixSocket('/tmp/mysql.sock') ->withUsername('test') ->withPassword('123456') ->withDbName('test') ->withCharset('utf8mb4'), 20); $pdo = $pdo_pool->get(); # 建表 SQL $create_table_sql = <<<SQL CREATE TABLE `users` (`name` varchar(4) COLLATE utf8mb4_general_ci NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci SQL; $sql = <<<SQL INSERT INTO `users` (`name`) VALUES ('abcd'); INSERT INTO `users` (`name`) VALUES ('abcde'); SQL; $st = $pdo->prepare($sql); $st->execute(); $st->closeCursor(); ``` 第二个插入语句按照正常情况会报出错误:SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'name' at row 1。如果我用原生的pdo_mysql就会报错,但是用swoole的pdo mysql连接池就会忽略这个错误,trycatch也不能捕获。 但是SQL改变一下顺序 ```php $sql = <<<SQL INSERT INTO `users` (`name`) VALUES ('abcde'); INSERT INTO `users` (`name`) VALUES ('abcd'); SQL; ``` 把错误的语句放到前面,swoole pdo mysql连接池就能捕获到错误了。连接池并非只执行第一句SQL,后面的SQL也会执行,问题出在第二句和以后的SQL若出现错误会被忽略。 ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-02-03
Jessica
忘了说PHP版本 PHP 8.1.1 Swoole 4.8.5 MySQL 8.0.24
赞
0
回复
2022-02-04
鲁飞
这里没有将异常抛出 https://github.com/swoole/library/pull/147
赞
0
回复
微信公众号
热门内容
作者其它话题
- AI助理BUG反馈
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。