确定调用“GET_LOCK”失败的原因

时间:2013-01-29 23:52:10

标签: php mysql

有没有办法确定为什么对MySQL GET_LOCK函数的调用失败(即返回0?),或者告诉我为什么我对下面问题的天真理解不正确?< / p>

the manual

  

尝试使用超时秒的超时来获取具有字符串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返回零?如果没有,有没有人有进一步调试这个问题的想法?

1 个答案:

答案 0 :(得分:0)

正如文档所述,该函数仅在超时时才返回零。这表明即使没有会话持有锁,也会触发1秒的超时。为了验证确实如此,我建议尝试使用更长的超时(例如10秒)。

如果即使使用较大的超时函数返回零,那么特定锁存在系统性问题。如果1秒的超时确实太短并且10秒超时解决了它,我建议打开错误报告,因为它不是预期的行为。