👔

SQLite3においてEnd Transaction呼び出し時にSQLITE_BUSYが帰ってきた場合にチェックするべきこと

2022/04/08に公開

対象読者

SQLiteのC/C++ API及びその薄いラッパー(C#の場合はSQLitePCL.raw)を使用している人

課題

BEGIN TRANSACTIONBEGIN EXCLUSIVE TRANSACTIONsqlite3_stepしてSQLITE_DONEを得られたのに、色々やった後END TRANSACTIONする段階になってSQLITE_BUSYが帰ってきた。

解決法

トランザクション中INSERTDELETEUPDATE文を発行していませんか?
更新処理を伴うSQL文をsqlite3_stepする場合はきちんと戻り値がSQLITE_DONEになっていますか?
RETURNING文やcount関数を使っている場合は1回SQLITE_ROWが帰ってきたので満足して次のSQL文を実行していませんか?

結論

SELECT文でない場合SQLITE_DONEかエラーコードを得られるまでsqlite3_stepを実行しましょう。

Discussion