SQLite3: トランザクションが開始されているかどうかを判断する

現在SQLite3のトランザクションが開始されているかどうかを判断するには、get_autocommit()を使用する。

使用例

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;
  }
}

*各関数のエラーチェックは省略してあります。