PHP MySQLi 锁表查询有时无法完成

PHP MySQLi Lock Tables Query Sometimes Does Not Complete

提问人:Daryl 提问时间:11/5/2016 最后编辑:Daryl 更新时间:11/5/2016 访问量:1810

问:

我正在尝试在运行一些代码时锁定一些表,并在完成后解锁表。

过程:

  1. 运行锁表MySQL查询。
  2. 运行一些 PHP 代码。
  3. 运行 Unlock Tables MySQL Query。

在运行此过程时,10 次中有 9 次一切都运行良好。有时,当我运行查询时,MySQL没有返回任何响应,PHP只是等待响应。由于没有发生响应,我永远不会进入步骤 2 或 3,并且表无限期地保持锁定状态。我在每次尝试中都运行完全相同的锁表查询。

我正在锁定许多表。下面是一个与我的实际表查询类似的示例。我多次使用同一表,并根据我试图阻止访问表的查询使用不同的别名。

$sql = "LOCK TABLES table1 as t1 WRITE
                    , table2 as t2 WRITE
                    , table3 WRITE
                    , table2 WRITE
                    , table4 WRITE
                    , table1 WRITE
                    , table5 WRITE
                    , table5 as t5 WRITE
                    , table6 as t6 WRITE
                    , table7 as t7 WRITE
                    , table7 WRITE
                    , table8 as t8 WRITE
                    , table9 t9 WRITE
                    , table10 t10 WRITE
                    , table11 t11 WRITE
                    , table12 WRITE;";

$this->mysqli = new mysqli(
    $this->credentials->server
    , $this->credentials->user
    , $this->credentials->password
    , $this->credentials->database
);

try{
    error_log('before first attempt lock tables '.$sql);
    $this->mysqli->query($sql);
    error_log('after first attempt lock tables');
} catch (Exception $e){
    error_log('Error locking tables: '.$e->getMessage());
}

error_log('After try catch.');
if($this->mysqli->error){
    error_log('lock table error: '.$this->mysqli->error);
}

当该过程失败时,我在PHP错误日志中看到“在第一次尝试锁定表之前”。我没有看到任何其他 error_log() 调用。经过一番检查,我确定这是因为PHP没有收到来自MySQL的响应。

我从来没有遇到过Catch Exception,因为MySQL没有返回错误。MySQL不会返回任何内容,除非我手动终止MySQL锁表进程。

如果我不终止进程,PHP代码永远不会停止等待mysql的响应。

php mysql mysqli

评论

0赞 Barmar 11/5/2016
其他一些客户端可能已锁定表,因此它永远无法获取所需的所有锁。
0赞 Daryl 11/5/2016
@Barmar感谢您的输入。我考虑了这一点,并验证了我是唯一试图锁定表的用户。所以我仍然不确定是什么原因导致了这个问题。
0赞 Barmar 11/5/2016
您是否在 ?它说它在做什么?LOCK TABLESshow processlist;
0赞 michaJlS 11/5/2016
你的代码在做什么,你需要手动锁定这么多表?
0赞 Daryl 11/5/2016
@Barmar 里面有。show processlist;Waiting for table metadata lock | LOCK TABLES ...

答: 暂无答案