sqlite3で「General error: 5 database is locked」が頻発, ‘PRAGMA journal_mode = WAL;’ で一応解決?

自分への備忘的にメモります.

sqlite3 を php+pdo で扱っているのですが,windows環境ではなんともなかったのに,linux環境に移したら,重い作業をさせるとなぜか「SQLSTATE[HY000]: General error: 5 database is locked」が頻発.検索してみましたが,同じ問題に直面している人の質問ばかりで,肝心の明快な答えは見つからず.

英語のサイトとか探ってもなかなか答えが見つからなかったのですが,「PRAGMA journal_mode = WAL;」のコードをちらっと目にして,期待もしていなかったのですが,そのコードを new PDO のすぐあとに追加してみました.

$db = new PDO("db.sq3","SQLITE_OPEN_READWRITE");
$db -> exec('PRAGMA journal_mode = WAL;');

そしたら,一応解決...「一応」というのは同じ条件でもやっぱり稀にエラーを吐くので,完全に解決したわけではありません.

Pragmaの設定やsetAttributeをいじれば,いずれ完全解決できるかもしれません.特に,ATTR_TIMEOUTが怪しい.ちなみにpdo のsetAttribute は下記のようにけっこうたくさんあるみたいです.

https://www.php.net/manual/ja/pdo.setattribute.php

なお,私のスキル不足かと思うのですが,sqlite3の挙動が windows 環境とlinux環境で違うことがけっこうあります.とにかくwindows環境の方が相性がいい印象です.たとえば,複雑で重いビューの処理速度なんかは,なぜかwindowsの方が10倍くらい早かったりします...

sqlite3って,とっても便利で重宝しているのですが,情報が本当に少ないです...