SQLite:当主数据库有打开的准备好的语句时,为什么我无法分离数据库?

Gei*_*ier 6 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

error: database Other is locked
Run Code Online (Sandbox Code Playgroud)

如果我sqlite3_reset(stmt)在之后执行 a sqlite3_step(stmt),它就会起作用。

为什么不相关数据库上的 open 语句会锁定“其他”数据库?我在文档中找不到解释。

CL.*_*CL. 6

交易文件称:

隐式事务(自动启动的事务,而不是由 BEGIN 启动的事务)会在最后一个活动语句完成时自动提交。当其准备好的语句被重置最终确定时,语句就完成了。

事务总是影响所有附加的数据库,因此打开的事务将使所有数据库保持锁定状态。

  • 感谢您对此有所了解。这实在是太隐蔽了。我想一旦不再需要reset()所有语句是一个很好的做法...... (2认同)