web-dev-qa-db-ja.com

SQLiteデータベースで同時書き込みが許可されないのはなぜですか?

SQLiteでJavaを使用してデータベースプログラミングを行っています。

一度に多くの接続が読み取り機能を持っているのに対して、データベースへの接続は一度に1つだけであることがわかりました。

SQLiteのアーキテクチャがこのように設計されたのはなぜですか?書き込まれている2つのものがデータベースの同じ場所に書き込まれていない限り、なぜ2つの書き込みを同時に実行できないのですか?

80
SteelToe

「複数の同時書き込み」は、単一のライター、複数のリーダーよりもコアデータベースエンジンで実行する方がはるかに難しいためです。これはSQLiteの設計パラメーターを超えており、SQLiteを含めると、SQLiteの非常に小さいサイズとシンプルさが損なわれる可能性があります。

高度な書き込みの同時実行性をサポートすることは、DB2、Oracle、SQL Server、MySQL、PostgreSQL、NonStop SQL、Sybaseなどの大規模なデータベースエンジンの特徴です。しかし、達成するのは技術的に難しく、データベース、テーブル、行のロックなどの広範な並行性制御と最適化戦略が必要です。より最近の実装では マルチバージョン並行性制御 が必要です。この問題/要件に関する調査は膨大であり、decades遡ります。

SQLiteは、複数のライターをサポートするほとんどのサーバー中心のDBMSとは非常に異なる設計哲学を持っています。 SQLの機能とリレーショナルモデルを個々のアプリケーションにもたらすように設計されており、実際に各アプリケーションに埋め込むことができます。その目標には、かなりのトレードオフが必要です。複数の同時ライターを処理するために必要な重要なインフラストラクチャとオーバーヘッドを追加しないことは、その1つです。

哲学は、SQLiteの 適切な用途 ページのステートメントで要約できます。

SQLiteはクライアント/サーバーデータベースと競合しません。 SQLiteはfopen()と競合します。

159
Jonathan Eunice

同じ場所に書き込むかどうかを判断できるサーバーがないからです。ファイルに書き込もうとしているプロセスは2つだけです。

コメントで指摘されているように、同時書き込みは内部スレッドでもサポートできます。これがどれだけうまく機能するかはわかりません(それについてもあまり考えませんでした)。とにかくSQLiteがスレッドを使用しない理由はここにあります:Hipp博士はスレッドは悪だと考えています。

DR Hippがスレッドは悪だと思っているという事実は SQLite FAQ に文書化されています。

12