让我试着用一般的说法来解释这个问题。
我们在版本 1.0.80 中使用 System.Data.SQLite Wrapper 的 SQLite 3.7.11 用于 .NetCF。
我们有两个数据库文件:
- 主数据.db
- 库存.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();
我们在没有 master_data.db 交互的情况下更新inventory.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:一个文件的多个连接 - 唯一的可写文件不会被持久化
谢谢你的帮助。
问候, Schibbl