トランザクションを開始し、Table1 にレコードを挿入し、実行時間の長い (最大 30 秒) Web サービスを呼び出すプロセスがあります。Web サービスの呼び出しが失敗した場合、挿入はロールバックされます (これが望ましいことです)。これは挿入の例です(実際には複数のテーブルへの複数の挿入ですが、この質問のために単純化しています):
INSERT INTO Table1 (UserId, StatusTypeId) VALUES (@UserId, 1)
次のように、最初のステップから Table1 をクエリする 2 番目のプロセスがあります。
SELECT TOP 1 * FROM Table1 WHERE StatusTypeId=2
次に、ユーザーのその行を更新します。プロセス 1 の実行中は、Table1 がロックされるため、プロセス 1 が完了するまでプロセス 2 は完了しません。これは、プロセス 1 が Web サービスの呼び出しを完了するまでに長い遅延が発生するため、問題になります。
プロセス 1 は 1 の StatusTypeId のみを挿入し、Table1 に挿入する唯一の操作でもあります。プロセス 2 は StatusTypeId = 2 に対してのみクエリを実行します。プロセス 2 に、Table1 への挿入を無視するが、選択した行をロックするように指示したいと思います。プロセス 2 のデフォルトの分離レベルでは待機が多すぎますが、IsolationLevel.ReadUncommitted がダーティ データの読み取りを許可しすぎているのではないかと心配しています。プロセス 2 を実行している 2 人のユーザーが誤って同じ行を取得することは望ましくありません。
挿入された行を無視すると言う ReadUncommitted 以外に使用する別の IsolationLevel はありますが、選択した行が選択されていることを確認してください。