8

WALモードのデータベースへの書き込みによって読み取りがブロックされているのを見ています-その理由がわかりません。

私のセットアップ:

  • SQLite3 データベース、journal_mode=WAL、同期=NORMAL
  • 複数の C++ プロセス (正確には 3 つ) がデータベースを使用します。これらのプロセス内のメソッドは、 との独自の非共有接続を開閉しsqlite3_open_v2ます。
  • データを挿入するメソッドは、データベースをSQLITE_OPEN_READWRITEモードで開きます
  • データベースから読み取るメソッド (つまり、select ステートメントのみを実行する) は、データベースをSQLITE_OPEN_READONLYモードで開きます。

WALモードでは、書き込みが発生している間に同時読み取りが可能になるはずです。

それでも、selectステートメントを使用して準備しているときに「データベースがロックされています」と表示されますsqlite3_prepare_v2

リーダーがブロックされる原因は何ですか? 「読み取り」が実際に何であるかを誤解していますか?

ヒントをいただければ幸いです。

ありがとう :)

4

1 に答える 1

1

これはデータベースがロックされているというエラーを引き起こす1つのケースであるため、すべてのsqlite3_stepの後にsqlite3_resetがあるかどうかを確認してください。sqlite3_prepare でステートメントを準備し、sqlite3_step で実行した後は、常に sqlite3_reset でリセットする必要があります。

sqlite3_reset(S) インターフェイスは、準備済みステートメント S をそのプログラムの先頭にリセットします。

これで問題が解決することを願っています...!!!

于 2013-02-19T10:08:54.213 に答える