この問題を一般的な用語で説明してみましょう。
バージョン 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 つのファイルへの複数の接続 - 唯一の書き込み可能なファイルは永続化されません
ご協力いただきありがとうございます。
よろしく、 シッブル