0

让我试着用一般的说法来解释这个问题。

我们在版本 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

4

1 回答 1

0

当您附加数据库时,事务总是涵盖所有这些数据库。

因此,当您要写入数据库时​​,您必须确保在主数据库或任何附加数据库上没有其他连接有任何打开的事务。

于 2013-06-18T13:58:16.187 回答