gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:33:09 25 4
gpt4 key购买 nike

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

#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_step(stmt) 之后执行 sqlite3_reset(stmt),它会起作用。

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

最佳答案

transaction documentation说:

An implicit transaction (a transaction that is started automatically, not a transaction started by BEGIN) is committed automatically when the last active statement finishes. A statement finishes when its prepared statement is reset or finalized.

交易总是affect all attached databases ,因此打开的事务将使所有数据库保持锁定状态。

关于c - SQLite:当主数据库有一个打开的准备语句时,为什么我不能分离数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15531498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com