只读数据库上的PDO :: exec()不返回

时间:2016-07-20 09:46:37

标签: php mysql pdo

我正在研究在我的代码上以只读模式运行MySQL的效果。我正在运行MySQL 5.5.49.0和PHP 5.5.9.1(在Ubuntu 14.04上)。我使用以下命令将数据库设置为只读:

flush tables with read lock;
set global read_only = 1;

如果我通过CLI连接并尝试插入,我得到:

ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock

如果我通过PDO与同一用户连接:

$pdo = new PDO('mysql:dbname=database;host=host', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
try {
    $result = $pdo->exec('insert ***');
    die(var_dump(__LINE__, $result));
} catch (Exception $e) {
    die(var_dump(__LINE__, $e->getMessage()));
}

浏览器无限加载。我尝试了一个具有良好旧的mysql_connect和mysql_query的模拟结构,在这种情况下,只读情境被忽略,返回0。也不是一个可行的解决方案。

如果数据库以只读模式运行,我宁愿不检查先发制人,因为通常情况并非如此,因此我可以在每次请求时保存额外的查询。

所以我的问题是:我如何从Mysql / PDO获得任何其他形式的异常或警告?

1 个答案:

答案 0 :(得分:0)

事实证明我使用具有SUPER权限的用户连接到我的本地开发数据库(使用我的Vagrant实例)。拥有SUPER权限的用户不受read_only选项的影响。

当我切换到普通用户时,我确实遇到了异常。

您可以考虑的另一个选择是使用super_read_only而不是普通的read_only。