2016-12-14 12 views
1

Я пишу какое-то программное обеспечение на C++, которое работает с базой данных SQLite.Очистить любые транзакции

У меня есть один раздел моего кода, который имеет много потенциальных ветвей и ошибок. У меня возникают проблемы с гарантией того, что мои транзакции всегда либо совершаются, либо откатываются.

Мне просто интересно, есть ли способ сказать: «Если есть транзакция, сверните ее». Или, может быть, есть тест, который я могу сделать, чтобы определить, действует ли транзакция?

Я не вижу никакого способа сделать это, и я подтвердил, что выполнение ROLLBACK, когда никакая транзакция не действует, вызывает ошибку. Но я просто подумал, что спрошу.

ответ

1

Многие языки имеют конструкцию try/finally. C++ не имеет, вы должны использовать RAII с объектом с конструктором/деструктор вместо:

class Transaction { 
    sqlite3* db; 
    public Transaction(sqlite3* db): db(db) 
    { 
     sqlite3_exec(db, "BEGIN"); 
    } 
    public ~Transaction() 
    { 
     if (success) 
      sqlite3_exec(db, "COMMIT"); 
     else 
      sqlite3_exec(db, "ROLLBACK"); 
    } 
}; 

Чтобы определить, является ли сделка success FUL, вы можете использовать функцию, как андроида setTransactionSuccessful() (смотри также beginTransaction()).

И немного обработка ошибок будет полезна (особенно SQLITE_BUSY при попытке COMMIT).

(Чтобы на самом деле проверить, является ли явная транзакция активна, вы могли бы test for auto-commit mode, но вы не должны это делать, если у вас есть лучший способ, чтобы убедиться, что операции надлежащим образом.)

 Смежные вопросы

  • Нет связанных вопросов^_^