讓我試着用一般的說法來解釋這個問題。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
感謝您的快速回復。我沒有提到,在發生錯誤的情況下,沒有其他master_data.db事務處於打開狀態。 – schibbl