提问人:Daryl 提问时间:11/5/2016 最后编辑:Daryl 更新时间:11/5/2016 访问量:1810
PHP MySQLi 锁表查询有时无法完成
PHP MySQLi Lock Tables Query Sometimes Does Not Complete
问:
我正在尝试在运行一些代码时锁定一些表,并在完成后解锁表。
过程:
- 运行锁表MySQL查询。
- 运行一些 PHP 代码。
- 运行 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的响应。
答: 暂无答案
评论
LOCK TABLES
show processlist;
show processlist;
Waiting for table metadata lock | LOCK TABLES ...