tk_wada
@tk_wada (Tk WADA)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SQLiteのロック状態の確認

解決したいこと

SQLite3で複数のアプリからアクセスしているのですが、時々コンフリクトが発生し、sqlite のエラーコード:5(Database is locked)が発生します。

lockしてるから、他が手を離すまで再度問い合わせすれば良いですが、もう少し賢く、一度lockされているかを問い合わせてから、問い合わせをするようなことを実装したい。

解決方法を教えて下さい。

発生している問題・エラー

sqlite3で、Database is locked.

自分で試したこと

lockしてるから、他が手を離すまで再度問い合わせ。

0

1Answer

エラーコード5 は SQLITE_BUSYhttps://www.sqlite.org/rescode.html#busy )を表します。

このドキュメントによれば、 sqlite3_busy_timeout() でタイムアウト時間を設定するとビジー状態が解消するかタイムアウトするまで自動的に再度問い合わせを行うようです。または sqlite3_busy_handler() で独自のビジー待ち処理を設定できます。ビジーかどうかだけを問い合わせる方法はなさそうでした。

また、 BEGIN IMMEDIATE; ... END; のトランザクション内では SQLITE_BUSY は発生しないと保証されているようです。 (BEGIN IMMEDIATE 自体は SQLITE_BUSY を発生させることがあるが、成功すれば END までの間は発生しない)

タイムアウトを設定したうえで BEGIN IMMEDIATE を使うのがベストだと思います。

3Like

Your answer might help someone💌