Perl DBD::SQLite を使用しているときに、単一のトランザクションで 2 番目のクエリに対して「データベースがロックされています」というエラーを与える SQLite に関する既知の問題はありますか? シナリオ: Linux、Perl DBI、AutoCommit => 0、2 つのコード ブロックを含むサブルーチン (ブロックを使用して変数名をローカライズ)。最初のコード ブロックでは、select ステートメントの prepare() によってクエリ ハンドルが作成され、それが execute() され、ブロックが閉じられます。2 番目のコード ブロックでは、update ステートメントの準備によって別のクエリ ハンドルが作成され、頻繁に (30% の確率で) SQLite/DBI がこの段階でデータベース ロック エラーを返します。エラーは、execute() 中ではなく、prepare() 中に発生すると思います。
私の回避策は、最初のクエリの後にコミットすることです。(最初のクエリで終了を呼び出しても役に立ちませんでした)。エレガンスとパフォーマンスに関連するいくつかの理由から、コミットしないことを好みます。元のコードは、データベースとして Postgres を使用して、何年もの間問題なく動作していました。効果なしで sqlite_use_immediate_transaction を試しました。
他のすべての状況では、SQLite が非常にうまく機能することがわかったので、これは SQLite の問題ではなく、DBD ドライバーの見落としであると思われます。悲しいことに、私の現在のコードはスクリプトとモジュールの大きな山であるため、短い単一ファイルのテスト ケースはありません。