如何检查我们是否在SQLite中处理事务?

时间:2014-01-30 21:19:51

标签: c++ c sqlite

我有多个需要写入数据库的函数,它们互相调用。到目前为止,我一直在使用SAVEPOINT来允许嵌套事务。问题是我需要在第一个SAVEPOINT而不是默认的DEFERRED锁上获得一个EXCLUSIVE锁(这是确保我以后不会被SQLITE_BUSY暂停的必要条件)。因此,我想做以下事情:

int foo(sqlite3 *db){
    unsigned char wasIn = 1;
    if (!sqlite3_isInTransaction(db)){
         sqlite3_query(db, "BEGIN EXCLUSIVE TRANSACTION");
         wasIn = 0;
    }
    ...do stuff....
    if (!wasIn){
         sqlite3_query(db, "COMMIT TRANSACTION");
    }
}

知道怎么做到这一点吗?

1 个答案:

答案 0 :(得分:5)

你检查过这个功能吗?:

http://www.sqlite.org/c3ref/get_autocommit.html

  

如果是,则sqlite3_get_autocommit()接口返回非零或零   给定的数据库连接是否处于自动提交模式,   分别。默认情况下,自动提交模式处于启用状态。自动提交模式是   由BEGIN声明禁用。自动提交模式由a重新启用   COMMIT或ROLLBACK。

所以如果BEGIN启动,那么sqlite3_get_autocommit()将返回0