1

私はASP.NETアプリケーションにこのプロセスを持っています:

  • 接続を開始する
  • 取引を開始する
  • 特定の LoadId を含む列を持つ SqlBulkCopy クラスを使用して、テーブル「LoadData」に多くの値を挿入します。
  • 次のようなストアド プロシージャを呼び出します。
    • 特定の LoadId のテーブル「LoadData」を読み取ります。
    • 各行に対して、多数のテーブルを読み取り、結果を一時 (#temp) テーブルに書き込むことを意味する多くの計算を行います (数分間続くプロセス)。
    • 特定の LoadId の「LoadDate」の行を削除します。
    • すべてが完了したら、結果を結果テーブルに書き込みます。
  • 何かが失敗した場合は、トランザクションをコミットするかロールバックします。

私の問題は、プロセスを開始する2人のユーザーがいる場合、2番目のユーザーは前のユーザーが終了するのを待たなければならず(挿入によりテーブルに排他ロックが設定されているように見えるため)、アプリケーションがタイムアウトになることがあります(そしてユーザーは待ちきれません:))。

最後のものを除いて相互作用がないため、ユーザーがすべてを並行して実行できるようにする方法を探しています:結果の書き込み。私を妨げているのは、「LoadData」テーブルの挿入/削除だと思います。他のトランザクション分離レベルを確認しましたが、何も役に立たないようです。

挿入が終了したときに、トランザクションを終了せずに、「LoadData」テーブルの排他ロックを削除できるようにすることは完璧です (SqlServer にテーブルではなく行のみを強制的にロックさせることは可能ですか?)。

なにか提案を?

4

3 に答える 3

1

トランザクションは、SQL/コードの小さくて高速に実行される部分をカバーする必要があります。異なるプラットフォームでは異なる方法で実装される傾向があります。彼らはテーブルをロックし、変更が大きくなるにつれてロックを拡張し、他のユーザーが同じ行/ページ/テーブルをクエリまたは更新することをロックアウトします。

トランザクションを忘れて、別の方法で処理エラーを処理してみませんか? データの整合性はトランザクションによって本当に保護されていますか、それともなくても大丈夫ですか?

于 2008-12-09T13:43:02.617 に答える
1

最後の部分を除いてcioncurrent操作に問題がないことが確実な場合は、最後のステートメントの直前にトランザクションを開始してみませんか.読み取り操作は互いにブロックしません...

于 2008-12-09T14:24:56.183 に答える
1

Books Online で SET TRANSACTION ISOLATION LEVEL READ COMMITTED SNAPSHOT を検索します。

于 2008-12-09T14:04:30.297 に答える