2016-04-01 9 views
0

同じSQLiteデータベースを使用する複数のプロセス(C++、Windows 8)があります。 SQLITE_CONFIG_SERIALIZEDPRAGMA 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です。このルールの例外はありますか?

+0

私はSQLITE_CONFIG_SERIALIZED' 'の有用性についてはよく分かりません。それを使用すると、データベースを共有するスレッドは、お互いのトランザクションを突き詰めるでしょう。通常は、各スレッドに独自の接続を与えることです。これには、より賢明なセマンティクスがあります。 –

答えて

0

SQLiteはsqlite3_prepareでデータベース/テーブルのロックを取得し、sqlite3_finalizeにリリースしました。ロックのタイプはSQL式によって異なります。

STMTを作成した場合は、実行してできるだけ早く確定する必要があります。それ以外の場合は、異なる接続をブロックします。

私のアプリケーションは、準備されたSTMTのリストを作成し、最後までそれを保持しました。一般的に、これはSQLiteの悪用です。

リンク:

関連する問題