2016-12-14 76 views
1

我在写一些C++软件,它可以与SQLite数据库一起工作。清除所有交易

我有一段代码,有很多潜在的分支和错误。我无法确保我的事务总是被提交或回滚。

我只是想知道是否有什么方法可以说“如果有一个交易正在进行,请将其滚回去。”或者也许我可以做一个测试来确定交易是否有效?

我看不出有什么办法做到这一点,并且我确认在没有事务生效时执行ROLLBACK会导致错误。但我只是想我会问。

回答

1

许多语言都有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,但如果你有更好的方法,以确保交易得到妥善处理,你不应该这样做。)