107

2 つのプロセスで使用される SQLite データベースがあります。SQLite の最新バージョンでは、1 つのプロセス (接続) がデータベースに書き込むトランザクションを開始している間に、他のプロセスがデータベースから同時に読み取ることができるのでしょうか?

4

2 に答える 2

175

さまざまな情報源 (主に sqlite.org) から情報を収集し、まとめました。

まず、デフォルトでは、複数のプロセスが同じ SQLite データベースを同時に開くことができ、複数の読み取りアクセスを並行して実行できます。

書き込みの場合、データベースへの 1 回の書き込みでデータベースが短時間ロックされ、読み取りも含めて何もデータベース ファイルにアクセスできなくなります。

バージョン 3.7.0 から、新しい「Write Ahead Logging」(WAL)オプションが利用可能になり、読み取りと書き込みを同時に進めることができます。

デフォルトでは、WAL は有効になっていません。WAL をオンにするには、SQLite のドキュメントを参照してください。

于 2012-04-30T17:21:53.357 に答える
25

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() への各呼び出しは、同じプロセス内の以前のすべての呼び出しをオーバーライドします。

于 2014-04-28T20:39:41.850 に答える