2016-12-14 124 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,你可以使用像Android這樣的setTransactionSuccessful()功能(見beginTransaction())。

有一點錯誤處理會很有用(尤其是SQLITE_BUSY,當你嘗試COMMIT時)。

(實際檢查明確的事務是否處於活動狀態,你可以test for auto-commit mode,但如果你有更好的方法,以確保交易得到妥善處理,你不應該這樣做。)