我试图在运行一些代码时锁定一些表,并在完成后解锁表。
过程:
运行此过程时,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 的响应。