SQLiteデータベースのロックを防ぐにはどうすればよいですか?


10

SQLite FAQから私はそれを知っていました:

複数のプロセスが同じデータベースを同時に開くことができます。複数のプロセスが同時に実行できますSELECT。ただし、いつでもデータベースに変更を加えることができるプロセスは1つだけです。

だから、これまで私は私ができる理解限り:1)複数のスレッドからの読み取りデシベル(SELECT複数のスレッド(から)2)リードデシベルSELECTシングルスレッドから)と書き込み(CREATEINSERTDELETE

しかし、リーダーはライターをブロックせず、ライターはリーダーをブロックしないため、同時実行性が向上する先行書き込みロギングについて読みました。読み取りと書き込みは同時に実行できます。

最後に、指定されたとき、私はそれを見つけときに完全に混乱しまし

SQLITE_LOCKEDエラーが発生するその他の理由は次のとおりです。

  • しようとしCREATEたりDROPしながら、テーブルやインデックスSELECTの文はまだ保留されています。
  • SELECT同じテーブルでがアクティブなときにテーブルに書き込もうとしています。
  • SELECTsqliteがそのように設定されていない場合に、マルチスレッドアプリケーションで同じテーブルに対して同時に2つを実行しようとする。
  • DBファイルのfcntl(3、F_SETLK呼び出しが失敗します。これは、たとえばNFSロックの問題が原因である可能性があります。この問題の1つの解決策は、DBを移動してコピーし、新しいInode値を持つようにコピーすることです。

だから、私は明確にしたいのですが、ロックを回避する必要がありますか?2つの異なるスレッドから同時に読み書きできますか?ありがとう。

回答:


8

リンクしたページは、かなり古いだけでなく、同じデータベース接続(または共有キャッシュモードでの複数接続)を介した同じプロセスからのアクセスについて説明しています。

WALモードではない場合、複数の接続が同じデータベースから読み取ることができますが、書き込みトランザクションは排他的です。つまり、他のリーダーまたはライターは許可されません。

WALモードでは、ライターとリーダーは互いにブロックしませんが、許可されるライターは1つだけです。


1
共有キャッシュモードの何が問題になっていますか?同じプロセスで複数のpythonスレッドを取得し、joblb Parallel for loopを介してテーブルに書き込むことができました。セットまでロックの問題isolation_level=Noneがありました。共有キャッシュモードがない場合、スレッド間でインスタンスを共有するにはどうすればよいですか?
Justin Dearing、2015

1
ドキュメントには、欠点が説明されています。デッドロックを回避する方法がわからない場合は特に危険です。
CL。

パーティーに遅刻しますが、このリンクは役に立ちます。manski.net/2012/10/sqlite-performance
infocyde
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.