我打开了一个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?编译设置?库上有配置选项吗?
我没有运气就搜索过平常的地方。预先感谢您的帮助。