SQLite:ATTACHed数据库上的SQLITE_BUSY和连接数据库的并行只读连接

时间:2013-06-18 13:24:15

标签: sqlite transactions database-connection system.data.sqlite

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

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

我们有两个数据库文件:

  • 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;

为了允许在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的其他事务。即使连接没有使用但是打开。 [/编辑]

5月这个问题,我们也面临着,成为问题的一部分? SQLite: Multiple Connections to one file - the one and only writable is not persisted

感谢您的帮助。

此致 Schibbl

1 个答案:

答案 0 :(得分:0)

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

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