0

この問題を一般的な用語で説明してみましょう。

バージョン 1.0.80 の .NetCF の System.Data.SQLite Wrapper で SQLite 3.7.11 を使用しています。

2 つのデータベース ファイルがあります。

  • master_data.db
  • 在庫.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();

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への確立された読み取り専用接続は、データベース全体をロックできません。唯一の書き込み可能なinventory.db接続によって実行された ATTACH コマンドにより、2 番目の書き込み可能な (唯一の) 接続がある場合でも。inventory.dbへの 2 番目の接続がないことは確かです。

[編集] エラーの場合、master_data.db への他のトランザクションは開かれていません。接続も使用されていませんが、開いています。[/編集]

私たちも直面しているこの問題は、問題の一部でしょうか?SQLite: 1 つのファイルへの複数の接続 - 唯一の書き込み可能なファイルは永続化されません

ご協力いただきありがとうございます。

よろしく、 シッブル

4

1 に答える 1