Karp 的技术博客

在PHP中,默认情况下,当一个事务因为锁等待超时而失败时,MySQL扩展不会抛出异常或错误,而是简单地返回一个空的结果集。这对于应用程序来说可能并不方便,因为无法区分是数据本身为空,还是因为锁等待超时导致读不到数据。

网上给的结局方案 都不是很靠谱 可能是场景不同吧.
延长锁等待时间,治标不治本 innodb_lock_wait_timeout.

我的遇到的场景是允许抛错异常中断操作的. 并发场景下 我们需要锁定一条记录 for update 排他锁. 如果锁的久了其他请求会等待锁解开.
默认锁等待50秒, 超时后PHP 并不会抛出异常. 找了很多方法 , 根本捕获不了 , 修改 innodb_rollback_on_timeout=ON也没有什么卵用.

最后自己的解决方案是: 通过记录响应时长 超过50秒则在代码中抛错.

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2023年07月27日 07:02
7

目录

来自 《PHP 事务中锁等待超时 读数据异常问题 for update》