让我试着用一般的说法来解释这个问题。
我们正在使用SQLite 3.7.11由System.Data.SQLite Wrapper for . net cf在1.0.80版本。
有两个数据库文件:
- master_data.db
- inventory.db
我们建立一个只读连接到master_data.db显示一些信息给用户。
Data Source=master_data.db;Version=3;Read Only=true;Journal Mode=OFF;Synchronous=OFF;
根据master_data.db中的一些信息,我们建立了一个可写连接到inventory.db来更新/插入库存信息。Data Source=inventory.db;Version=3;Journal Mode=DELETE;Synchronous=OFF;
为了在update/insert语句中允许一致性检查,我们将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:多个连接到一个文件-唯一可写的文件不被持久化
谢谢你的帮助。
问候,Schibbl
当附加数据库时,事务总是包含所有这些数据库。
所以当你想写一个数据库时,你必须确保没有其他连接在主数据库或任何附加的数据库上有任何打开的事务。