2013-03-20 43 views
4

爲什麼下面的代碼無法正常工作: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, 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_step(stmt)後做sqlite3_reset(stmt),它的工作原理。

爲什麼不相關數據庫上的打開語句會鎖定「其他」數據庫?我無法在文檔中找到解釋。

回答

4

transaction documentation說:

隱式交易(即自動啓動的事務,而不是一個交易開始通過BEGIN)致力於最後一個活動的語句完成時自動。當準備好的聲明是resetfinalized時,聲明結束。

總是affect all attached databases,所以一個打開的事務將鎖定所有的數據庫。

+1

感謝您對此有所瞭解。這真的是隱藏的。我想這是一個很好的習慣來重置()所有語句不再需要時... – Geier 2013-03-21 08:33:05

相關問題