私はビジネスエンティティを更新するルーチンを持っています。このアップデートには、約6種類のテーブルが含まれています。すべてのコマンドがトランザクション内で実行されています。これらのデッドロックを回避するにはどうすればよいですか?
最近、データベースからルックアップテーブルにアクセスするルーチンにコードを追加する必要がありました。ルックアップ・コードはすでに別のビジネス・オブジェクトに存在していたため、そのビジネス・オブジェクトを使用しました。例:
Using tr As DbTransaction = myConnection.BeginTransaction()
ExecuteCommand1(tr)
ExecuteCommand2(tr)
If myLookupTable.GetLookupTable().FindById(id).HasFlagSet Then
ExecuteCommand3(tr)
End If
End Using
ただし、ルックアップ・テーブル・ビジネス・オブジェクトはハング/デッドロックです。これは、元のルーチンで使用されているトランザクションへの参照がないためです。
調査をした後、ルックアップテーブルロジックをIsolationLevel
をReadUncommitted
に設定して、独自のトランザクションに入れようとしました。これは、私が望む結果を私に与えました。しかし、さらなる研究の後、私はこれを正しく実装したかどうかを第二に推測しています。
アクティブなトランザクションへの参照が自分のルックアップテーブルオブジェクトで使用できないと仮定して、私がベストプラクティスとみなしたことはありますか?私は何かが欠けているように感じる。
ルックアップテーブルでcommand1またはcommand2が何かしますか? –
いいえ、そうではありません。彼らはそれを読むことさえしません。しかし、彼らはルックアップテーブルへのFKを持っているテーブルで動作します。それは直感的に私にロックの問題を示唆するものではありません。 –