System.Data.SQLite.SQLiteConnectionを使用してSQLiteに接続しています。
あるコネクションでデータベースを参照中に、別のコネクションがデータベースを更新する場合に、ロック解放待ちとなり、30秒ほどして database is lockedのエラーが返ってきます。
(トランザクションを組んでいるのでcommitの行で待ちになっています)
ロック待ちになることは理解しており、業務仕様上問題ありませんが、
ロック待ちとなった場合に、たとえば3秒で諦めるという設定はできないのでしょうか?
試しに、以下の値も変更してみましたが、期待した動きとはなりませんでした。
SQLiteConnection.BusyTimeout
SQLiteCommand.CommandTimeOut
もしご存知の方がいらっしゃればご教示いただけると幸いです。
【DB】SQLite3
【言語】C#,VB.NET (.NetFramework4.0)
【2021/9/13 追記】
試しに、トランザクションを組まずに更新処理をするように実装を変更した場合は、
SQLiteCommand.CommandTimeOutの値が効いていることがわかりました。
SQLコマンド自体のタイムアウトとトランザクションのタイムアウトは別なのかもしれません。
また、transactionScopeを使用する場合には、TransactionOptions.Timeoutでトランザクションに対する
タイムオーバー値が設定できるようなのですが、明示的なトランザクションを使用した場合に、
同等のタイムオーバーを設定するプロパティを見つけることができませんでした。
明示的なトランザクションの場合は、トランザクションに対してタイムオーバー値を設定できないのでしょうか?
VBですが、参考までソースを記載します。
VB.NET
1 Using con As SQLiteConnection = New SQLiteConnection() 2 3 con.ConnectionString = "Version=3;xxxx.db;New=True;Compress=True;journal mode = delete;" 4 con.Open() 5 6 Dim sql = "update xxxxx" 7 8 Dim trn As SQLiteTransaction = Nothing 9 10 Using cmd As SQLiteCommand = New SQLiteCommand(sql, con) 11 12 cmd.CommandTimeout = 2 13 14 Try 15 trn = con.BeginTransaction() 16 17 cmd.ExecuteNonQuery() 18 19 trn.Commit() 20 21 Catch ex As SQLiteException 22 trn.Rollback() 23 MsgBox(ex.Message) 24 End Try 25 26 End Using 27 28 End Using
回答2件
あなたの回答
tips
プレビュー