在PHP中,默认情况下,当一个事务因为锁等待超时而失败时,MySQL扩展不会抛出异常或错误,而是简单地返回一个空的结果集。这对于应用程序来说可能并不方便,因为无法区分是数据本身为空,还是因为锁等待超时导致读不到数据。
网上给的结局方案 都不是很靠谱 可能是场景不同吧.
延长锁等待时间,治标不治本 innodb_lock_wait_timeout
.
我的遇到的场景是允许抛错异常中断操作的. 并发场景下 我们需要锁定一条记录 for update
排他锁. 如果锁的久了其他请求会等待锁解开.
默认锁等待50秒, 超时后PHP 并不会抛出异常. 找了很多方法 , 根本捕获不了 , 修改 innodb_rollback_on_timeout=ON
也没有什么卵用.
最后自己的解决方案是: 通过记录响应时长 超过50秒则在代码中抛错.