👔
SQLite3においてEnd Transaction呼び出し時にSQLITE_BUSYが帰ってきた場合にチェックするべきこと
対象読者
SQLiteのC/C++ API及びその薄いラッパー(C#の場合はSQLitePCL.raw)を使用している人
課題
BEGIN TRANSACTION
やBEGIN EXCLUSIVE TRANSACTION
をsqlite3_step
してSQLITE_DONE
を得られたのに、色々やった後END TRANSACTION
する段階になってSQLITE_BUSY
が帰ってきた。
解決法
トランザクション中INSERT
やDELETE
、UPDATE
文を発行していませんか?
更新処理を伴うSQL文をsqlite3_step
する場合はきちんと戻り値がSQLITE_DONE
になっていますか?
RETURNING
文やcount
関数を使っている場合は1回SQLITE_ROW
が帰ってきたので満足して次のSQL文を実行していませんか?
結論
SELECT
文でない場合SQLITE_DONE
かエラーコードを得られるまでsqlite3_step
を実行しましょう。
Discussion