1
我在寫一些C++軟件,它可以與SQLite數據庫一起工作。清除所有交易
我有一段代碼,有很多潛在的分支和錯誤。我無法確保我的事務總是被提交或回滾。
我只是想知道是否有什麼方法可以說「如果有一個交易正在進行,請將其滾回去。」或者也許我可以做一個測試來確定交易是否有效?
我看不出有什麼辦法做到這一點,並且我確認在沒有事務生效時執行ROLLBACK會導致錯誤。但我只是想我會問。
我在寫一些C++軟件,它可以與SQLite數據庫一起工作。清除所有交易
我有一段代碼,有很多潛在的分支和錯誤。我無法確保我的事務總是被提交或回滾。
我只是想知道是否有什麼方法可以說「如果有一個交易正在進行,請將其滾回去。」或者也許我可以做一個測試來確定交易是否有效?
我看不出有什麼辦法做到這一點,並且我確認在沒有事務生效時執行ROLLBACK會導致錯誤。但我只是想我會問。
許多語言都有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,但如果你有更好的方法,以確保交易得到妥善處理,你不應該這樣做。)