清除任何交易
Clear any transactions
我正在编写一些与 SQLite 数据库一起使用的 C++ 软件。
我的代码有一部分有很多潜在的分支和错误。我无法确保我的事务总是提交或回滚。
我只是想知道是否有任何方式可以说明 "If there's a transaction underway, roll it back." 或者也许我可以进行测试以确定交易是否有效?
我看不出有什么办法可以做到这一点,而且我确认在没有事务生效时执行 ROLLBACK 会导致错误。但我只是想问一下。
许多语言都有 try
/finally
结构。
C++ 没有,您必须将 RAII 与带有 constructor/destructor 的对象一起使用:
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
完整,您可以使用类似 Android 的 setTransactionSuccessful() (see also beginTransaction()) 的函数。
一点点错误处理会很有用(尤其是 SQLITE_BUSY 当您尝试提交时)。
(要实际检查显式事务是否处于活动状态,您可以 test for auto-commit mode,但如果您有更好的方法来确保正确处理事务,则不应这样做。)
我正在编写一些与 SQLite 数据库一起使用的 C++ 软件。
我的代码有一部分有很多潜在的分支和错误。我无法确保我的事务总是提交或回滚。
我只是想知道是否有任何方式可以说明 "If there's a transaction underway, roll it back." 或者也许我可以进行测试以确定交易是否有效?
我看不出有什么办法可以做到这一点,而且我确认在没有事务生效时执行 ROLLBACK 会导致错误。但我只是想问一下。
许多语言都有 try
/finally
结构。
C++ 没有,您必须将 RAII 与带有 constructor/destructor 的对象一起使用:
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
完整,您可以使用类似 Android 的 setTransactionSuccessful() (see also beginTransaction()) 的函数。
一点点错误处理会很有用(尤其是 SQLITE_BUSY 当您尝试提交时)。
(要实际检查显式事务是否处于活动状态,您可以 test for auto-commit mode,但如果您有更好的方法来确保正确处理事务,则不应这样做。)