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

前端之家收集整理的这篇文章主要介绍了SQLite:当主数据库有一个打开的预准备语句时,为什么我不能分离数据库?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么以下代码不起作用:

#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相关文章