同じSQLiteデータベースを使用する複数のプロセス(C++、Windows 8)があります。 SQLITE_CONFIG_SERIALIZED
とPRAGMA busy_timeout = 60000;
で接続を設定しました。使用されているジャーナルモード - DELETE
。複数のプロセスとSQLite_BUSYからSQLiteデータベースにアクセス
テストシナリオ:
- プロセス#1は、接続を開き、5秒
- プロセス#2のスリープ、リード/ライトの接続を開き、読み出し/そのプロセスの後
を書き込むことができる行います#1はデータベースへの書き込みに失敗しました - SQLite API(sqlite3_step、sqlite3_finalize)の呼び出し直後にSQLITE_BUSY
を受け取りました。プロセス#2は依然として問題なく接続を使用します。
私はクローズドトランザクションを持っていません。私はデータベースに対して長い操作をしていません。これ以外に何ができるのでしょうか?
私は、プロセス内の複数のスレッドと同じSQLite接続を使用します。 SQLiteのドキュメントによれば、これは設定オプションSQLITE_CONFIG_SERIALIZED
でOKです。このルールの例外はありますか?
私はSQLITE_CONFIG_SERIALIZED' 'の有用性についてはよく分かりません。それを使用すると、データベースを共有するスレッドは、お互いのトランザクションを突き詰めるでしょう。通常は、各スレッドに独自の接続を与えることです。これには、より賢明なセマンティクスがあります。 –