2009-06-17 14 views
37

私はストレージエンジンとしてSQLiteを調べていますが、SQLiteが読み込み時にデータベースファイルをロックするかどうか不思議です。SQLiteは読み込み時にデータベースファイルをロックしますか?

私の計画されたプロジェクトではほとんど書き込みがなく、多くの読み込みが行われるため、読み込みパフォーマンスが心配です。データベースがロックしている場合は、これを軽減するための対策(メモリキャッシュなど)がありますか?そのWikipedia pageから

答えて

42

いくつかのコンピュータプロセスまたはスレッドは問題なく、同じデータベースにアクセスすることができます。並行して複数の読取りアクセスを満たすことができます。より正確には

、そのFAQから:

複数のプロセスが同時に同じデータベースのオープンを持つことができます。複数のプロセスが同時にSELECTを実行することができます。しかし、随時、1つのプロセスだけがデータベースに変更を加えることができます。

データベースへの単一の書き込みは何も(さえ読んでいない)すべてでそれにアクセスすることはできませんので、しかし、は、短い時間のためにデータベースをロックしません。詳細はFile Locking And Concurrency In SQLite Version 3にあります。誰かがすぐにデータベースに書き込もうとしない限り、基本的にデータベースを読むことは問題ありません。その場合、DBはそのトランザクションの実行にかかる時間だけ排他的にロックされ、その後ロックは解除されます。しかし、PENDINGまたはEXCLUSIVEロック時に、データ・セットの読み取り操作で正確に何が行われるかについての詳細は不明です。私の推測では、彼らはSQLITE_BUSYを返すか、読めるようになるまでブロックします。最初のケースでは、特に少数の書き込みしか期待していない場合は、再試行するのは難しいことではありません。

38

データベースジャーナルモードをWrite-Ahead Loggingに設定すると、読み取り時にロックを回避できます(http://www.sqlite.org/wal.html参照)。

+4

これは、WALモードが利用可能になる前に書かれた受け入れられた回答よりも優れています。 – Stretch

関連する問題