5秒でタイムアウトさせたいと思ってます。
SQLite 関数のsqlite_busy_timeoutみたいな事をPDOで実行したいと
思っているのですが、うまく動きません。
該当のデータベースでロックが発生している場合に
SQLをwaitさせるのではなく、タイムアウトさせたいです。
$sql = "SELECT * FROM AAAAA";
$param = array();
$test = new PDO("mysql:dbname=DB_NAME;host=DB_HOST",$_SERVER['SCRIPT_NAME'],'');
$test->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$test->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$test->setAttribute(PDO::ATTR_TIMEOUT,5);
$st = $test->prepare($sql);
わかる方、いたら教えて下さい。
ERRMODE_EXCEPTION を設定しているので、下記のように try~catch でエラーイベントをキャッチアップしたらいかがでしょう。
try{ $sql = "SELECT * FROM AAAAA"; $param = array(); $test = new PDO("mysql:dbname=DB_NAME;host=DB_HOST",$_SERVER['SCRIPT_NAME'],''); $test->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $test->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); $test->setAttribute(PDO::ATTR_TIMEOUT,5); $st = $test->prepare($sql); } catch (PDOException $err) { //--タイムアウトエラー処理を記述する }
MySQLなら、MySQL側にtimeoutパラメータがありますのでそちらの秒数を5秒にされるとよいのではないでしょうか。
MySQLへログインして、以下のコマンドをrootユーザで実行してみてください。
ただし、再起動すると変更情報は失われますのでMySQLの設定ファイル(my.cnf)にも明記しておいてください、
set global wait_timeout=5;
set global innodb_lock_wait_timeout=5;
set global interactive_timeout=5;
set global table_lock_wait_timeout=5;
うまく動かないですね・・
うーーん・・