确定SQLite3事务是否处于活动状态

时间:2009-11-12 03:01:46

标签: iphone sqlite

我在我的数据库上运行END TRANSACTION,偶尔会收到错误

  

#1“无法提交 - 没有事务处于活动状态”

在尝试提交之前,有没有办法确定事务是否处于活动状态?我手动跟踪"BEGIN TRANSACTIONS",但我觉得有更好的方法。

我正在使用C API

4 个答案:

答案 0 :(得分:12)

您可能想要检查一下:

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

根据该页面,如果您正在进行交易,sqlite3_get_autocommit()将返回0。

答案 1 :(得分:0)

这很奇怪。我认为sqlite总是在一个事务中,要么由你明确创建,要么由sqlite隐式创建:

http://www.sqlite.org/lang_transaction.html

所以我认为错误意味着它不在你发起的事务中......如果这是你需要知道的,那么sqlite似乎可以期待你跟上它。当然不是非常方便,但我想这是一个简单的API的成本。 = /

答案 2 :(得分:0)

您要查找的接口实际上已在下一版本的sqlite中实现,如您在注释中所见:https://sqlite.org/draft/c3ref/txn_state.html

Determine the transaction state of a database

int sqlite3_txn_state(sqlite3*,const char *zSchema);

The sqlite3_txn_state(D,S) interface returns the current transaction state of schema S in database connection D. If S is NULL, then the highest transaction state of any schema on databse connection D is returned. Transaction states are (in order of lowest to highest):

SQLITE_TXN_NONE
SQLITE_TXN_READ
SQLITE_TXN_WRITE

If the S argument to sqlite3_txn_state(D,S) is not the name of a valid schema, then -1 is returned.

答案 3 :(得分:-1)

在SQLite中,使用BEGIN TRANSACTION ... END TRANSACTION创建的事务不会嵌套。

对于嵌套事务,您需要使用SAVEPOINT和RELEASE命令。

请参阅http://www.sqlite.org/lang_transaction.html

http://www.sqlite.org/lang_savepoint.html