我在我的数据库上运行END TRANSACTION
,偶尔会收到错误
#1“无法提交 - 没有事务处于活动状态”
在尝试提交之前,有没有办法确定事务是否处于活动状态?我手动跟踪"BEGIN TRANSACTIONS"
,但我觉得有更好的方法。
我正在使用C API
答案 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命令。