これは以前に何度か尋ねられたことは知っていますが、別の解決策があるかもしれないと思いました。ただし、それを機能させるには助けが必要です。
アイデア: ビジネス層はデータ層関数を呼び出します。データ層関数は、データベース コンテキストのストアド プロシージャ関数への呼び出しを再試行ポリシーでラップします。基本的に、ストアド プロシージャへの実際の呼び出しをインポートして管理する LINQ ツールが必要ですが、再試行可能なエラーの再試行ポリシーでロジックをラップすることを望みます。
この概念の多くは、SQLException をキャッチして再試行するための優れた C# コーディング スタイルとはから引用されていますが、これは LINQ to SQL コマンドに対してのみ機能し、DBML で生成されたストアド プロシージャ関数を呼び出すのではないようです。
古い方法:
Sub BLFunctionWithoutRetry()
Using DB as CustDataContext
DB.sp_GetCustomers()
End Using
End Sub
再試行を伴う新しいロジック:
Sub BLFunctionWithRetry()
GetCustomers()
End Sub
Function GetCustomers() As List(Of Customer)
Return Retry(Of List(Of Customer))(sp_GetCustomers())
End Function
Function Retry(Of T)(FunctionToCall As Func(Of T)) As T
Dim Attempt As Integer = 0
While True
Try
Using DB as MyDataContext
DB.FunctionToCall()
End Using
Catch ex as SQLException
If Retryable() Then Attempt += 1
If Attempt >= Max Or Not Retryable() Then Throw
End Try
End While
Function Retryable() As Boolean
Return True
End Function
これが一般的な考え方です。ただし、上記の Retry 関数を書くには助けが必要です。明らかなエラーが発生していますFunctionToCall() is not a member of 'MyDataContext'
。さらに、これを記述する方法がわからないため、任意の長さの入力パラメーターを持つストアドプロシージャで機能します。