2 つのプロセスで使用される SQLite データベースがあります。SQLite の最新バージョンでは、1 つのプロセス (接続) がデータベースに書き込むトランザクションを開始している間に、他のプロセスがデータベースから同時に読み取ることができるのでしょうか?
2 に答える
さまざまな情報源 (主に sqlite.org) から情報を収集し、まとめました。
まず、デフォルトでは、複数のプロセスが同じ SQLite データベースを同時に開くことができ、複数の読み取りアクセスを並行して実行できます。
書き込みの場合、データベースへの 1 回の書き込みでデータベースが短時間ロックされ、読み取りも含めて何もデータベース ファイルにアクセスできなくなります。
バージョン 3.7.0 から、新しい「Write Ahead Logging」(WAL)オプションが利用可能になり、読み取りと書き込みを同時に進めることができます。
デフォルトでは、WAL は有効になっていません。WAL をオンにするには、SQLite のドキュメントを参照してください。
SQLite3 は明示的に複数の接続を許可します:
(5) 複数のアプリケーションまたは同じアプリケーションの複数のインスタンスが、1 つのデータベース ファイルに同時にアクセスできますか?
複数のプロセスが同時に同じデータベースを開くことができます。複数のプロセスが同時に 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() への各呼び出しは、同じプロセス内の以前のすべての呼び出しをオーバーライドします。