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

时间:2016-11-04 22:26:16

标签: php mysql mysqli

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

过程:

  1. 运行锁定表MySQL查询。
  2. 运行一些PHP代码。
  3. 运行解锁表MySQL查询。
  4. 在运行此过程时,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的响应。

0 个答案:

没有答案