2016-07-20 11 views
1

私のコードで読み取り専用モードでMySQLを実行した場合の影響を調べています。MySQL 5.5.49.0とPHP 5.5.9.1を組み合わせて実行しています(Ubuntu 14.04で)。読み取り専用データベースでPDO :: exec()が返されない

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

私はCLI経由で接続して、私が手に挿入しようとした場合::私はPDO経由で同じユーザーで接続した場合

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

を:私は、読み取り専用にするには、次のコマンドを使用してデータベースを設定し

$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を使ってsimular構造を試しましたが、その場合は読み取り専用の状況は無視され、0が返されます。また、実行可能な解決策ではありません。

通常、データベースが読み取り専用モードで実行されている場合は、先読みをチェックしません。これは通常そうではないため、要求ごとに余分なクエリを保存できます。

私の質問:どのように例外や警告を他の形式のMySQL/PDOから取得するのですか?

+0

'PDOException'は' Exception'ではありません –

+0

これは、ExceptionのインスタンスであるRuntimeExceptionのインスタンスであるため、実際には関係ありません。そしてそれらの実行さえも空白のページで止まっていたはずです。 – Timo

答えて

0

SUPER権限を持つユーザーを使用してローカル開発データベース(私のVagrantインスタンス)に接続していました。 SUPER特権を持つユーザーは、read_onlyオプションの影響を受けません。

通常のユーザーに切り替えると、例外が発生しました。

通常のread_onlyではなくsuper_read_onlyを使用することもできます。

関連する問題