SQLiteからFAQ私はそれを知っています:
複数のプロセスが同じデータベースを同時に開くことができます。複数のプロセスが
SELECT
を同時に実行できます。ただし、いつでもデータベースに変更を加えることができるプロセスは1つだけです。
だから、私が理解できる限り:1)複数のスレッドからdbを読み取り(SELECT
)2)複数のスレッドからdbを読み取り(SELECT
)、単一のスレッドから書き込みます(CREATE
、INSERT
、DELETE
)
しかし、私は Write-Ahead Logging について読んでいます。これは、リーダーがブロックしないため、同時実行性が向上しますライターとライターはリーダーをブロックしません。読み取りと書き込みは同時に実行できます。
最後に、 it が見つかったとき、私は完全に混乱しています。
SQLITE_LOCKEDエラーが発生するその他の理由は次のとおりです。
CREATE
ステートメントがまだ保留中に、テーブルまたはインデックスをDROP
またはSELECT
しようとしています。- 同じテーブルで
SELECT
がアクティブなときにテーブルに書き込もうとしています。- Sqliteがそのように設定されていない場合に、マルチスレッドアプリケーションで同じテーブルに対して同時に2つの
SELECT
を実行しようとする。- dBファイルのfcntl(3、F_SETLK呼び出しが失敗します。これは、たとえばNFSロックの問題が原因である可能性があります。この問題の1つの解決策は、DBを移動してコピーし、新しいInode値を持つようにコピーすることです。
だから、私は明確にしたいのですが、ロックを回避する必要がありますか? 2つの異なるスレッドから同時に読み書きできますか?ありがとう。
リンクしたページは、かなり古いだけでなく、同じデータベース接続を介した(または 共有キャッシュモード での複数接続を介した、同じプロセスからのアクセスは使用しないでください)アクセスについて説明しています。
WALモードでない場合、複数の接続が同じデータベースから読み取ることができますが、書き込みトランザクションは排他的です。つまり、他のリーダーまたはライターは許可されません。
WALモードでは、ライターとリーダーは互いにブロックしませんが、許可されるライターは1つだけです。