私はASP.NETアプリケーションにこのプロセスを持っています:
- 接続を開始する
- 取引を開始する
- 特定の LoadId を含む列を持つ SqlBulkCopy クラスを使用して、テーブル「LoadData」に多くの値を挿入します。
- 次のようなストアド プロシージャを呼び出します。
- 特定の LoadId のテーブル「LoadData」を読み取ります。
- 各行に対して、多数のテーブルを読み取り、結果を一時 (#temp) テーブルに書き込むことを意味する多くの計算を行います (数分間続くプロセス)。
- 特定の LoadId の「LoadDate」の行を削除します。
- すべてが完了したら、結果を結果テーブルに書き込みます。
- 何かが失敗した場合は、トランザクションをコミットするかロールバックします。
私の問題は、プロセスを開始する2人のユーザーがいる場合、2番目のユーザーは前のユーザーが終了するのを待たなければならず(挿入によりテーブルに排他ロックが設定されているように見えるため)、アプリケーションがタイムアウトになることがあります(そしてユーザーは待ちきれません:))。
最後のものを除いて相互作用がないため、ユーザーがすべてを並行して実行できるようにする方法を探しています:結果の書き込み。私を妨げているのは、「LoadData」テーブルの挿入/削除だと思います。他のトランザクション分離レベルを確認しましたが、何も役に立たないようです。
挿入が終了したときに、トランザクションを終了せずに、「LoadData」テーブルの排他ロックを削除できるようにすることは完璧です (SqlServer にテーブルではなく行のみを強制的にロックさせることは可能ですか?)。
なにか提案を?