2016-04-02 22 views
0

SQLiteのロックのレベルは、UNLOCKED,SHARED,RESERVED,,EXCLUSIVEです。SQLite3とロックの解放

SQLite APIを呼び出してそのロックを取得して解放する情報が見つかりません。

私はsqlite3_stepが呼び出されたときに取得ロックを理解したよう。ロックのタイプは、準備されたステートメントの式に依存します。また、このコマンドは、カスタムトランザクション内の書き込み操作のロックをエスカレートすることができます。私はsqlite3_stepでもロック解除の書き込みを理解したよう

- このfuncがSQLITE_DONEまたはエラーコードを返します。私はドキュメントを見つけられませんでしたが、この機能は実行の最後にRESERVED/PENDING/EXCLUSIVEをリリースする必要があります。

しかし、私は読み取り操作で何が起こるか分かりません。 照会された行をすべて取得するには、sqlite3_stepを何回か呼び出す必要があります。

私はロックを解除-通知APIからOSのキャッシュと引用についてSQLiteのドキュメントを見つけました:it is not possible for one call to sqlite3_step() to return SQLITE_ROW and then the next SQLITE_LOCKED

私は読み取り操作にsqlite3_stepの最初の呼び出しは、OSのキャッシュにファイルからSHAREDロックと負荷データを取得することを前提としています。 sqlite3_stepSQLITE_ROW(つまりSQLITE_DONEまたはエラーコード)以外の何かを返すと、ロックが解除されました。

それは正しいですか?

読み取り操作のために取得したロックを手動で解放する方法はありますか? sqlite3_reset

+0

[ロッキング](http://www.sqlite.org/lockingv3.html)および[トランザクション](http://www.sqlite.org/lang_transaction.html)に関するドキュメントを読みます。 –

答えて

0

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

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

例: SELECT式のSTMTを作成した場合は、SHAREDロックを取得しました。したがって、異なる接続からのすべての書き込み操作は、STMTが終了するまでブロックされます。