web-dev-qa-db-ja.com

SQLiteデータベースのロックを防ぐにはどうすればよいですか?

SQLiteからFAQ私はそれを知っています:

複数のプロセスが同じデータベースを同時に開くことができます。複数のプロセスがSELECTを同時に実行できます。ただし、いつでもデータベースに変更を加えることができるプロセスは1つだけです。

だから、私が理解できる限り:1)複数のスレッドからdbを読み取り(SELECT)2)複数のスレッドからdbを読み取り(SELECT)、単一のスレッドから書き込みます(CREATEINSERTDELETE

しかし、私は Write-Ahead Logging について読んでいます。これは、リーダーがブロックしないため、同時実行性が向上しますライターとライターはリーダーをブロックしません。読み取りと書き込みは同時に実行できます。

最後に、 it が見つかったとき、私は完全に混乱しています。

SQLITE_LOCKEDエラーが発生するその他の理由は次のとおりです。

  • CREATEステートメントがまだ保留中に、テーブルまたはインデックスをDROPまたはSELECTしようとしています。
  • 同じテーブルでSELECTがアクティブなときにテーブルに書き込もうとしています。
  • Sqliteがそのように設定されていない場合に、マルチスレッドアプリケーションで同じテーブルに対して同時に2つのSELECTを実行しようとする。
  • dBファイルのfcntl(3、F_SETLK呼び出しが失敗します。これは、たとえばNFSロックの問題が原因である可能性があります。この問題の1つの解決策は、DBを移動してコピーし、新しいInode値を持つようにコピーすることです。

だから、私は明確にしたいのですが、ロックを回避する必要がありますか? 2つの異なるスレッドから同時に読み書きできますか?ありがとう。

10
Andrei Orlov

リンクしたページは、かなり古いだけでなく、同じデータベース接続を介した(または 共有キャッシュモード での複数接続を介した、同じプロセスからのアクセスは使用しないでください)アクセスについて説明しています。

WALモードでない場合、複数の接続が同じデータベースから読み取ることができますが、書き込みトランザクションは排他的です。つまり、他のリーダーまたはライターは許可されません。

WALモードでは、ライターとリーダーは互いにブロックしませんが、許可されるライターは1つだけです。

8
CL.