sqlite3:分离数据库产生数据库被锁定错误

时间:2019-05-21 17:43:11

标签: sqlite

我打开了一个sqlite3数据库。我附加第二个数据库,检查第一个数据库和第二个数据库在表中是否具有相同的值,然后分离第二个数据库。 detach命令给出错误“数据库db2已锁定”。

该进程不是多线程的。没有其他进程访问数据库。我在NFS和本地磁盘上得到相同的结果。我尝试在分离之前插入一个延迟,以防错误中提到的锁与文件系统有关。

如果我在下面的代码中注释掉SELECT语句,则分离有效。因此,基本上,先执行附加操作,再执行分离操作,但是如果在分离之前执行SQL代码,则会收到SQLITE_ERROR返回状态和上面显示的错误消息。

SQLite版本3.22.0.1

顺便说一句,我意识到我可以选择count(s.id)而不是遍历SELECT *返回的每一行,但是其他帖子谈到确保sqlite3_step()被调用直到返回SQLITE_DONE,并且我想尝试所有方法在这里发布。

    sqlite3_stmt *stmt;
    char *errMsg;
    const char *zLeftover;
    int count = 0;

    // DB declared as:
    // sqlite3 *DB;
    // opened as:
    // sqlite3_open(":memory:", &DB);
    sqlret = sqlite3_exec(DB, "ATTACH DATABASE foo.db AS db2;", NULL, 0, &errMsg);
    assert(sqlret == SQLITE_OK);

    sqlret = sqlite3_prepare_v2(DB, 
        "SELECT * FROM sessions s INNER JOIN db2.sessions s2 ON s2.id=s.id;",
             -1, &stmt, &zLeftover);
    assert(sqlret == SQLITE_OK);

    sqlret = sqlite3_step(stmt);
    while (sqlret == SQLITE_ROW) {
        ++count;
        sqlret = sqlite3_step(stmt);
    }
    sqlret = sqlite3_finalize(stmt);
    assert(sqlret == SQLITE_OK);

    sqlret = sqlite3_exec(DB, "DETACH DATABASE db2", NULL, 0, &errMsg);
    // This assert fails with SQLITE_ERROR
    assert(sqlret == SQLITE_OK);

我希望sqlite3_finalize(stmt)调用可以除去对附加数据库的任何内部锁定。在分离之前是否必须执行另一个调用或其他SQL?编译设置?库上有配置选项吗?

我没有运气就搜索过平常的地方。预先感谢您的帮助。

0 个答案:

没有答案