在PHP中,默认情况下,当一个事务因为锁等待超时而失败时,MySQL扩展不会抛出异常或错误,而是简单地返回一个空的结果集。这对于应用程序来说可能并不方便,因为无法区分是数据本身为空,还是因为锁等待超时导致读不到数据。
网上给的结局方案 都不是很靠谱 可能是场景不同吧.
延长锁等待时间,治标不治本 innodb_lock_wait_timeout.
我的遇到的场景是允许抛错异常中断操作的. 并发场景下 我们需要锁定一条记录 for update 排他锁. 如果锁的久了其他请求会等待锁解开.
默认锁等待50秒, 超时后PHP 并不会抛出异常. 找了很多方法 , 根本捕获不了 , 修改 innodb_rollback_on_timeout=ON也没有什么卵用.
最后自己的解决方案是: 通过记录响应时长 超过50秒则在代码中抛错.
文章作者: Leon
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Leon!
相关推荐
2015-07-03
PHP 获取客户端ip地址
PHP 获取客户端ip地址 一、如果没有使用代理服务器,REMOTE_ADDR = 客户端IPHTTP_X_FORWARDED_FOR = 没数值或不显示 $ip = $_SERVER['REMOTE_ADDR']; 二、使用透明代理,REMOTE_ADDR = 最后一个代理服务器 IPHTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215) 这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。 $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 三、使用普通匿名代理服务器,REMOTE_ADDR = 最后一个代理服务器 IPHTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.12...
2022-03-08
Swoole 出现 deadlock 字样
=================================================================== [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!=================================================================== [Coroutine-1]--------------------------------------------------------------------#0 Swoole\Coroutine\Http\Client->recv() called at [/opt/webserver/vendor/swlib/saber/src/WebSocket.php:102]#1 Swlib\Saber\WebSocket->recv() called at [/opt/webserver/script/src/Task/BinanceContract.php:133]#...
2019-10-21
分割PHP配置文件 php.ini
分割PHP配置文件 的方法 编译php 时 增加如下参数 ./configure --with-config-file-scan-dir=PATH --wi... 这个是指定附加的ini配置文件的目录位置,此目录下的ini文件会被追加到php.ini配置中。 我们可以在 PATH 目录下 创建分割配置文件 $ cat redis.ini extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731/redis.so
2020-04-05
MinPHP 框架学习笔记
手册 MixPHP V2.1开发指南 MixPHP 环境要求Linux, OS X, WSLPHP >= 7.2Swoole >= 4.4.4 (websocket >= 4.4.8) 我先在本地弄个docker环境 git clone https://github.com/libenfu/docker-example.git 或 下载zip 按照 https://www.3pub.cn/index.php/archives/427.html 教程搭建docker 环境.当然自己修改下 docker-compose.yml 进入 cd 2.lnmp-example mixphp 代码放到 swoole/code 目录 运行 composer // 忽略扩展检查安装composer create-project --prefer-dist --ignore-platform-reqs mix/mix-skeleton mix 2.1.*Content-Length mismatch, received 1101147 bytes out of the ex...
2017-12-13
PHP 中 `default_socket_timeout`
default_socket_timeout 是 PHP 中的一个配置选项,用于设置 socket 连接的默认超时时间(以秒为单位)。在进行网络请求(如通过 fsockopen、stream_socket_client 或其他网络函数)时,超时时间决定了在等待响应时的最大时间限制。 1. 配置方法default_socket_timeout 可以在 php.ini 文件中进行配置,也可以在运行时通过 ini_set 函数进行设置。 1.1 在 php.ini 中设置打开您的 php.ini 文件,找到以下行并修改其值: ; Default timeout for socket based streams (seconds)default_socket_timeout = 60 将 60 修改为您希望的超时时间(单位为秒)。 1.2 在代码中设置如果您希望在运行时动态修改超时时间,可以使用 ini_set 函数: ini_set('default_socket_timeout', 30); // 设置为 30 秒 2. 如何使用当您进行网络请求时,如果服...
2016-11-16
PHP四种序列化方案
当在 PHP 中处理数据序列化时,有多种方案可供选择。在本篇博客中,我们将探讨四种常用的 PHP 序列化方案,它们分别是:PHP 原生序列化、JSON 序列化、XML 序列化和 MessagePack 序列化。 PHP 中的四种序列化方案在 PHP 中,序列化是一种将数据结构转换为可存储或传输格式的过程。以下是四种常用的 PHP 序列化方案: 1. PHP 原生序列化PHP 原生序列化是 PHP 提供的一种内置的序列化方案。您可以使用 serialize() 函数将 PHP 对象序列化为字符串,并使用 unserialize() 函数将序列化的字符串反序列化为 PHP 对象。这种方式非常方便,可以序列化包含各种数据类型的复杂对象。 $data = array('name' => 'John', 'age' => 30);$serializedData = serialize($data);$unserializedData = unserialize($serializedData); PHP 原生序列...
评论
公告
记录技术实践,分享学习与思考。



