清除任何交易

Clear any transactions

本文关键字:交易 任何 清除      更新时间:2023-10-16

我正在编写一些与sqlite数据库一起使用的C 软件。

我有一个代码的一个部分,其中有很多潜在的分支和错误。我很难确保我的交易始终是承诺或回滚。

我只是想知道是否有任何方法可以说"如果正在进行交易,那就回滚。"也许我可以进行测试以确定交易是否有效?

我看不到任何方法,我确认在没有交易的情况下执行回滚会导致错误。但是我只是以为我会问。

许多语言具有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)。

(要实际检查显式交易是否处于活动状态,您可以测试自动命令模式,但是如果您有更好的方法来确保交易正确处理。)