为什么以下代码不起作用:
#include <stdio.h>
#include <sqlite3.h>
int main(void)
{
sqlite3 *pDb;
sqlite3_stmt *stmt;
char *errmsg;
sqlite3_open(":memory:", &pDb);
sqlite3_exec(pDb, "CREATE TABLE Test(a INTEGER)", NULL, NULL, NULL);
sqlite3_exec(pDb, "INSERT INTO Test(a) VALUES(1)", NULL, NULL, NULL);
sqlite3_prepare_v2(pDb, "SELECT * FROM Test", -1, &stmt, NULL);
sqlite3_step(stmt);
sqlite3_exec(pDb, "ATTACH 'Test.db' as Other;", NULL, NULL, NULL);
sqlite3_exec(pDb, "DETACH Other;", NULL, NULL, &errmsg);
printf("error: %s\n", errmsg);
return 0;
}
输出:
error: database Other is locked
如果我在
sqlite3_reset(stmt)
之后执行sqlite3_step(stmt)
,它就会工作。为什么无关数据库上的open语句会锁定“其他”数据库?我在文件里找不到解释。
最佳答案
transaction documentation表示:
当最后一个活动语句完成时,将自动提交隐式事务(自动启动的事务,而不是由begin启动的事务)。当准备好的语句reset或finalized时,语句结束。
事务始终affect all attached databases,因此打开的事务将锁定所有数据库。