5

次のコードが機能しないのはなぜですか。

#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_reset(stmt)の後に行うと、sqlite3_step(stmt)動作します。

無関係なデータベースのopenステートメントが「Other」データベースをロックするのはなぜですか?ドキュメントに説明が見つかりませんでした。

4

1 に答える 1

5

取引文書には次のように書かれています。

暗黙のトランザクション(BEGINによって開始されたトランザクションではなく、自動的に開始されたトランザクション)は、最後のアクティブなステートメントが終了したときに自動的にコミットされます。ステートメントは、準備されたステートメントがリセットまたは終了すると終了ます。

トランザクションは常に接続されているすべてのデータベースに影響するため、開いているトランザクションはすべてのデータベースをロックしたままにします。

于 2013-03-20T20:43:11.107 に答える