PHP MySQLi 锁表查询有时不完整

Dar*_*ryl 5 php mysql mysqli

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

过程:

  1. 运行锁定表 MySQL 查询。
  2. 运行一些 PHP 代码。
  3. 运行解锁表 MySQL 查询。

运行此过程时,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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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