0

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

根据手册

尝试使用由字符串 str 给出的名称获取锁,使用 timeout 秒的超时。如果锁定成功返回 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?如果没有,是否有人对进一步调试此问题有任何想法?

4

1 回答 1

1

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

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

于 2018-05-08T05:00:32.660 回答