2つのプロセスで使用されるSQLiteデータベースがあります。SQLiteの最新バージョンでは、一方のプロセス(接続)がデータベースに書き込むためのトランザクションを開始しているときに、もう一方のプロセスがデータベースから同時に読み取ることができるのでしょうか。
回答:
私はさまざまなソース、主にsqlite.orgから情報を収集し、それらをまとめました。
まず、デフォルトでは、複数のプロセスで同じSQLiteデータベースを同時に開くことができ、複数の読み取りアクセスを並行して実行できます。
書き込みの場合、データベースへの1回の書き込みでデータベースが短時間ロックされ、読み取りであっても、データベースファイルにアクセスすることはできません。
バージョン3.7.0以降、新しい「先行書き込みログ」(WAL)オプションが使用可能になり、読み取りと書き込みを同時に続行できます。
デフォルトでは、WALは有効になっていません。WALをオンにするには、SQLiteのドキュメントを参照してください。
(5)複数のアプリケーションまたは同じアプリケーションの複数のインスタンスが単一のデータベースファイルに同時にアクセスできますか?
複数のプロセスで同じデータベースを同時に開くことができます。複数のプロセスが同時にSELECTを実行できます。ただし、データベースに変更を加えることができるプロセスは1つだけです。
接続を共有するには、SQLite3共有キャッシュを使用します。
バージョン3.3.0以降、SQLiteには特別な「共有キャッシュ」モードが含まれています(デフォルトでは無効になっています)
バージョン3.5.0では、共有キャッシュモードが変更され、同じキャッシュを単一のスレッド内だけでなくプロセス全体で共有できるようになりました。
5.0共有キャッシュモードの有効化
共有キャッシュモードは、プロセスごとに有効になります。Cインターフェースを使用すると、次のAPIを使用して、共有キャッシュモードをグローバルに有効または無効にできます。
int sqlite3_enable_shared_cache(int);
sqlite3_enable_shared_cache()を呼び出すたびに、sqlite3_open()、sqlite3_open16()、またはsqlite3_open_v2()を使用して作成された後続のデータベース接続に影響します。すでに存在するデータベース接続は影響を受けません。sqlite3_enable_shared_cache()を呼び出すたびに、同じプロセス内の以前のすべての呼び出しが上書きされます。