SQLiteで多重同時アクセスすると本当に落ちるかやってみた!

執筆:2018.12.06
編集:2018.12.06


SQLite Version 3

チェック方法
・テーブル更新とSELECTをする

その1:PHP SQLite3クラスで試してみる

PHP Warning: SQLite3::exec(): database is locked in
と表示されクエリーは失敗する

書き込む必要がない場合は読み込み専用にすることができる
SQLITE3_OPEN_READWRITE

その2:PHP PDO_SQLiteクラスで試してみる

DBファイル名-journal
ができて、書き込み待ちになる
自動で対処してくれるのでこちらのほうが使い勝手がいい。
しかし書き込み中に、サーバースレッドのタイムアウトになるとデータが破損する可能性があるので
気を付けよう
★PHP7.3からPDO_SQLiteは読み込み専用モードで開くことができるようになった。

どちらがいいかは、案件によるので臨機応変に対応しよう。

Webサーバー SQLiteで同時アクセス対策するには?


よくある疑問

SQLiteは同時アクセスするとロックでエラーになる
トランザクションが・・・。
などなど

という意見がありますが、
月間数万アクセスくらいなら平気で耐えれます。
たいていは他の原因です。

主な原因と対策

  1. サーバーの同時プロセス数制限による503エラー
    1. 画像の枚数やサイズの確認
    2. ページキャッシュの利用を検討する
  2. SQLiteデータベースを長時間占有している
    1. プログラムを見直し、読み込み、書き込みを迅速に処理し、さくっとDBを解放する
    2. DBをきれいに解放してからクライアントに応答する。
  3. SQLiteは書き出しが遅いため、その処理時間を上回るリクエストが連続できている
    1. 設計の見直し
    2. データを更新する必要があるのか?
    3. SQLiteで運用できる限界を超えていないか検討する

まとめ


きちんと設計する。
サーバーのリソース制限などにより、実行中の処理中断でデータベースが破損することがあるので
SQLiteを利用する際は、定期的なバックアップを忘れないようにしましょう