0

讓我試着用一般的說法來解釋這個問題。SQLite:SQLITE_BUSY在ATTACHed數據庫和並行只讀連接到附加數據庫

我們正在使用版本1.0.80中的.NetCF的System.Data.SQLite Wrapper的SQLite 3.7.11。

我們有兩個數據庫文件:

  • master_data.db
  • inventory.db

我們建立一個只讀連接到master_data.db顯示一些信息給用戶。

Data Source=master_data.db;Version=3;Read Only=true;Journal Mode=OFF;Synchronous=OFF; 

我們建立可寫連接inventory.db更新/根據一些資料,master_data.db

Data Source=inventory.db;Version=3;Journal Mode=DELETE;Synchronous=OFF; 

要允許更新/插入語句一致性檢查插入庫存信息,我們將master_data.db附加到此連接。

ATTACH 'master_data.db' AS md_db 

我們在啓動事務inventory.db

SQLiteTransaction tx = connection.BeginTransaction(); 

我們inventory.db更新一個簡單的表,而master_data.db的互動。

using (IDbCommand cmd = connection.CreateCommand()) 
{ 
    cmd.CommandText = @"UPDATE header_info SET count_time = @countTime"; 
    SQLiteParameterparam = new SQLiteParameter("@countTime", 
               DateTime.Now.ToUniversalTime()) 
    cmd.Parameters.Add(param) 
    return cmd.ExecuteNonQuery(); 
} 

我們提交更改,它會掛起,直到發生超時和SQLITE_BUSY提高。

tx.Commit();// BAAM! due to SQLITE_BUSY 

我們不明白這裏有什麼問題。與master_data.db建立的只讀連接無法鎖定整個數據庫。即使由於ATTACH命令而存在第二個可寫(唯一的一個)連接 - 這是由唯一可寫的inventory.db連接執行的。我們確信它不是第二次連接到inventory.db

[編輯] 在錯誤的情況下,沒有其他事務master_data.db打開。即使連接沒有被使用但是打開。

可能這個問題,我們也面臨,成爲問題的一部分? SQLite: Multiple Connections to one file - the one and only writable is not persisted

感謝您的幫助。

問候, Schibbl

回答

0

當你連接數據庫,事務總是涵蓋所有這些數據庫。

所以,當你想要寫入數據庫時​​,你必須確保沒有其他連接在主數據庫或任何連接的數據庫上有任何打開的事務。

+0

感謝您的快速回復。我沒有提到,在發生錯誤的情況下,沒有其他master_data.db事務處於打開狀態。 – schibbl