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

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

概述为什么以下代码不起作用: #include <stdio.h>#include <sqlite3.h>int main(void){ sqlite3 *pDb; sqlite3_stmt *stmt; char *errmsg; sqlite3_open(":memory:", &pDb); sqlite3_exec(pDb, "CREATE T 为什么以下代码不起作用:

#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);    sqlite3_exec(pDb,"INSERT INTO Test(a) VALUES(1)",NulL);    sqlite3_prepare_v2(pDb,"SELECT * FROM Test",-1,&stmt,NulL);    sqlite3_step(stmt);    sqlite3_exec(pDb,"ATTACH 'Test.db' as Other;",NulL);    sqlite3_exec(pDb,"DETACH Other;",&errmsg);    printf("error: %s\n",errmsg);    return 0;}

输出:

error: database Other is locked

如果我在sqlite3_step(stmt)之后执行sqlite3_reset(stmt),它可以工作.

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

解决方法 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 07001 or 07002.

事务始终为affect all attached databases,因此打开的事务将锁定所有数据库.

总结

以上是内存溢出为你收集整理的SQLite:当主数据库有一个打开的预准备语句时,为什么我不能分离数据库?全部内容,希望文章能够帮你解决SQLite:当主数据库有一个打开的预准备语句时,为什么我不能分离数据库?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/sjk/1150202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存