SQLite:当主数据库有一个打开的预准备语句时,为什么我不能分离数据库?

时间:2013-03-20 18:10:29

标签: c sqlite

为什么以下代码不起作用:

#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语句会锁定“Other”数据库?我在文档中找不到解释。

1 个答案:

答案 0 :(得分:4)

transaction documentation说:

  

当最后一个活动语句完成时,将自动提交隐式事务(自动启动的事务,而不是由BEGIN启动的事务)。当其准备好的陈述为resetfinalized时,陈述结束。

交易总是affect all attached databases,因此打开的交易会锁定所有数据库。