現在SQLite3のトランザクションが開始されているかどうかを判断するには、get_autocommit()
を使用する。
- トランザクションが開始されている場合: 自動コミットが無効になるので
0
が返る。 - トランザクションが開始されていない場合: 自動コミットが有効になるので
0以外
が返る。 www.sqlite.org
使用例
SQLite3でトランザクションを二重に開始するとエラーが発生するため、呼び出し元ですでにトランザクションが開始されている可能性がある場合は以下のようにチェックして必要であればトランザクションを開始する。
void example(sqlite3* db) { char* err = NULL; bool transactionStarted = sqlite3_get_autocommit(db) == 0; if(!transactionStarted) { sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &err); } try { // ... SQLite3データベースの更新 if(!transactionStarted) { sqlite3_exec(db, "COMMIT;", NULL, NULL, &err); } } catch(const std::exception& e) { if(!transactionStarted) { sqlite3_exec(db, "ROLLBACK;", NULL, NULL, &err); } throw; } }
*各関数のエラーチェックは省略してあります。