#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:当主数据库有一个打开的预准备语句时,为什么我不能分离数据库?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)