PHP SQLite の database is locked について

投稿日: 2009-12-15 18:43:09

SQLiteはファイルベースなので、同時書き込みに弱い。 書き込み時にはファイル全体(DB全体)がロックされる。 PHPだとauto commitがオンの時には、"database is locked"エラーが出ない。 オートコミットの場合、データベースがロックされていると解除されるまで待ってから処理を続行するという処理を自動で行ってくれるみたい。 一回の処理で大量のクエリが発行される場合には、明示的にトランザクションの開始・終了をした方が遙かに速い。 一方で、100クライアントが同時に書き込みを行う集計の様なプログラムの場合、オートコミットにしていた方が簡単っぽい。 (というかこういう場合は速度的にテキストファイルに書き込んだ方が遙かに速い) しかし、実際にapacheのab やcurlで100クライアントで合計1000回のリクエストを受けるテストをしてみると1%~5%ぐらい取りこぼしがあった。 エラーも吐いていなかったのでどこで取りこぼしがあったのか分からなかった。 10クライアントだと取りこぼしはなかった。 テキストファイルでも100クライアントだと0.3%ほど取りこぼしが…もっと調べる必要がある。 ちなみにテスト結果はローカルマシン(WinXP + Xampp)での結果。 集計とかアクセス解析こそ、Google App Engineを活用すべきかも。
setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { //$dbh->beginTransaction(); $sql = "insert into table (name,date) values (DATETIME('now'),DATETIME('now','localtime') );"; $dbh->query($sql); //$dbh->commit(); } catch (Exception $e) { $fp = fopen("error_php.txt", "a"); $error = $dbh->errorInfo(); fwrite($fp, $error[2] . "\n"); fclose($fp); } print "done."; ?>
このブログはソースコード貼り付けにくいな。。