如何检查我们是否正在使用SQLite进行事务处理?

cha*_*m15 2 c c++ sqlite

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

int foo(sqlite3 * db){
    无符号char wasIn = 1;
    如果(!sqlite3_isInTransaction(db)){
         sqlite3_query(db,“ BEGIN独家交易”);
         wasIn = 0;
    }
    ...做东西....
    如果(!wasIn){
         sqlite3_query(db,“ COMMIT TRANSACTION”);
    }
}

任何想法如何做到这一点?

mar*_*inj 5

您是否检查了此功能?:

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

如果给定的数据库连接是否处于自动提交模式,则sqlite3_get_autocommit()接口分别返回非零或零。默认情况下,自动提交模式是打开的。自动提交模式被BEGIN语句禁用。通过COMMIT或ROLLBACK重新启用自动提交模式。

因此,如果BEGIN已启动,sqlite3_get_autocommit()则将返回0