清除所有交易
问题描述:
我在写一些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,但如果你有更好的方法,以确保交易得到妥善处理,你不应该这样做。)