清除任何交易

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,但如果您有更好的方法来确保正确处理事务,则不应这样做。)