加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 18:55:00 所属栏目:百科 来源:网络整理
导读:为什么以下代码不起作用: #include stdio.h#include sqlite3.hint 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 I
为什么以下代码不起作用:

#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: %sn",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,因此打开的事务将锁定所有数据库.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读