Webクローラーの場合、INSERT INTOテーブルを使用して1つのプロセスを2GB(2000万行)の巨大なテーブルに実行しています。時々、実行時間の長い 2 番目のプロセス「SELECT * from table」クエリがすべての行をエクスポートします (そしてデータを変換します)。SELECT * の実行中は、もちろん、テーブルは書き込みのためにロックされます。したがって、INSERT INTO クエリは例外をスローします。最初のプロセスで例外をキャッチし、それが機能するまで毎分再試行します。
奇妙なことは、例外がキャッチされ、INSERT が理論的に通過した後、挿入は常にエラー「sqlite3.IntegrityError: PRIMARY KEY must be unique」で失敗することです。テーブルを確認すると、主キーが重複していないことがわかります。行は実際にはまったく追加されていません。行を手動で挿入しようとすると、機能します。
例外に関係する何らかのロールバックが行われている疑いがあります。何をすべきかわかりません(最初のプロセスにデータベースに触れないように指示するシグナルファイルを作成する以外は)。何か案は?
または、一般的な問題を適切に解決する方法に関する他のアイデア: 1 つのプロセスがテーブルに書き込み、2 番目のプロセスが時々完全なテーブルを必要としますか?
これは、python 2.7 を使用した sqlite 3.5.9 にあります。(依存関係が追加されているため、sqlite をアップグレードしないことをお勧めします。)