11

プロセスAで開いたまま書き込みを行っているSQLiteデータベースがあります。プロセスBから読み取り専用で使用できるようにしたいと思います。

文書によると、

  • データベースのロックが解除されている場合、データベースの読み取り(または書き込み)ができない可能性があります-不適切
  • データベースが共有されている場合、2つのプロセスはデータベースを読み取ることができますが、最初のプロセスは書き込むことができません-不適切
  • プロセスが書き込みを行う場合は、他のプロセスが書き込みできないことを意味するEXCLUSIVEロックが必要です-不適切

プロセスAは多くの小さな書き込みを行うため、トランザクションのコミットごとにコピーを作成するのは効率的ではないと思います。

私が見ることができる唯一の方法は、データベースがUNLOCKED状態になるまで待機し、読み取り中にSHAREDロックを取得してから、それを解放することです。その間、プロセスAは書き込みを行い、ロックが使用可能になるまでブロックされます-ロックが使用可能になった場合(プロセスBがクラッシュした場合はどうなりますか?)。これは、プロセスAとプロセスBがロックをめぐって競合することを意味します。BはSHAREDを必要とし、AはEXCLUSIVEを必要とします。これにより、処理速度が低下したり、同時実行の問題が発生したりします。

書き込みと読み取りを同時に行うという私の目的を達成する方法はありますか?

4

3 に答える 3

19

WAL モードを使用します。同時読み取りと 1 つの書き込みをサポートします。

于 2012-08-24T23:32:25.447 に答える
-7

あなたの質問に対する簡単な答えは - 「不可能」です

そうすることに成功したとしても、間違った結果を得ていることを意味します。

データベースの基本を知っておくべきだと思います -

データベースがファイル処理やその他のデータ保存方法より優れている理由。

簡単な答え -

WW、WR、RW 操作を同時に実行することはできません。

( W - 書き込み、R - 読み取り)

ただし、無限の RR 操作を同時に実行できます。

オンラインバンキングシステムや鉄道予約システムについて考えてみてください。

トランザクションというデータベースの特別な機能が使用されます。

ACIDに従います。

これは原子性、一貫性、分離、耐久性です。

原子性 - 完全か、またはまったくないかのいずれかです。

一貫性 - 各トランザクションの後、システムはある一貫した状態から別の一貫した状態に移行します。

分離 - すべてのトランザクションは互いに分離して実行されます。

(書き込みクエリが最初に来る場合、最初に実行されることを意味します)書き込みと読み取りの両方の操作を同時に行う方法はありません。ナノ秒の差があってもシステムが検出します。ただし、そうすることに成功した場合。データベースは単にそれを拒否するか、優先度の高い操作を実行します。

耐久性 - システムは耐久性がなければなりません。

--単純なデータベースよりはかなり広いかもしれませんが、理解するのに役立つかもしれません.--

2.

SQLite データベース ファイルはページとして編成されます。各ページのサイズは、512 から SQLITE_MAX_PAGE_SIZE までの 2 のべき乗です。SQLITE_MAX_PAGE_SIZE のデフォルト値は 32768 です。

通常は 1073741823 に設定されている SQLITE_MAX_PAGE_COUNT パラメータは、1 つのデータベース ファイルで許可される最大ページ数です。データベース ファイルがこれよりも大きくなるような新しいデータを挿入しようとすると、SQLITE_FULL が返されます。

したがって、32768 * 1073741823 となり、35,184,372,056,064 (35 兆バイト) になります。

ソースで SQLITE_MAX_PAGE_COUNT または SQLITE_MAX_PAGE_SIZE を変更できますが、これにはもちろん、アプリケーション用に SQLite のカスタム ビルドが必要になります。私の知る限り、コンパイル時以外にプログラムで制限を設定する方法はありません (ただし、間違っていることが証明されれば幸いです)。

于 2014-06-04T13:32:14.693 に答える