有没有办法确定为什么对MySQL GET_LOCK
函数的调用失败(即返回0?),或者告诉我为什么我对下面问题的天真理解不正确?< / p>
尝试使用超时秒的超时来获取具有字符串str给出的名称的锁。如果成功获得锁定,则返回1;如果尝试超时,则返回0(例如,因为另一个客户端先前已锁定该名称)
我正在调试试图使用以下SQL
获取锁定的应用程序SELECT GET_LOCK('thinkup_2_b2_dev.crawler', 1) AS result
每当此代码从PHP上下文运行时,result
始终为零。这发生在我的本地开发机器上,并且是在我第一次运行应用程序时发生的。在其他世界中,我相对确定没有先前的锁定。
当我使用第三方工具(特别是SequelPro)连接到数据库并运行以下命令
; SHOW FULL PROCESSLIST
我没有看到任何关于锁的提及(我的理解是当我运行 SHOW FULL PROCESSLIST
时会出现这些类型的锁)。我所看到的只是单行(我认为这与我目前正在使用的连接相对应。)
9617 root localhost thinkup_2_b2_dev Query 0 NULL SHOW FULL PROCESSLIST
(根据一些独立测试,似乎SHOW FULL PROCESSLIST
没有显示这些锁定)
有没有办法让MySQL告诉我它为何从调用get_lock
返回零?如果没有,有没有人有进一步调试这个问题的想法?
答案 0 :(得分:0)
正如文档所述,该函数仅在超时时才返回零。这表明即使没有会话持有锁,也会触发1秒的超时。为了验证确实如此,我建议尝试使用更长的超时(例如10秒)。
如果即使使用较大的超时函数返回零,那么特定锁存在系统性问题。如果1秒的超时确实太短并且10秒超时解决了它,我建议打开错误报告,因为它不是预期的行为。