2009-08-20 4 views
2

私は、ユーザーがボタンをクリックしてSQL Serverのストアドプロシージャを呼び出して計算を実行する.NETページを持っています。通常、計算には約2分かかり、完了するとテーブルのフィールドが更新されます。今私は、ユーザーが誤ってブラウザを閉じると、ストアドプロシージャはまだ実行され、テーブルを更新するという問題があります。私は、ページが実行を停止する必要があると考えていたが、ブラウザが閉じていても実行し続けるのではなく、テーブルのフィールドの更新をやめてしまったのですか?任意のアイデアプロセスを停止する方法?ブラウザが閉じても、ストアドプロシージャとプログラムは実行されていますか?

答えて

3

ページリクエストによってデータベースが呼び出されると、ページは終了するのを待ちますが、データベースにはページのノレッジがありません。したがって、何らかの理由でページが待機しなくなった場合、データベースは終了するまでうまく動作し続けます。実際には、ページリクエストには、ブラウザがまだ開いているかどうかについての知識もありません。したがって、ユーザがブラウザを閉じると、ページリクエスト自体は終了するまで実行されます。誰もその結果を聞くことができないだけです。

+0

しかし、フィールドを更新するためのコーディングは、格納されたprocではなく、コードの背後にあります。だから、私はなぜページがまだ完了したらフィールドを更新するのだろうか? –

+2

@WeeShian:これはページ要求がブラウザから切断されているためです。ページ要求はブラウザではなくWebサーバーで実行されることを覚えておいてください。ページ要求は、ブラウザがまだ開いているかどうかを知らない。 –

+0

icic..本当にありがとうございます! –

3

サーバーには、ブラウザがまだ開いているかどうかはわかりません。ブラウザはプロセスを起動し、ページがダウンロードされるまでにサーバーとのやりとりが完了します。

+0

しかし、ボタンをクリックしてブラウザを閉じた後、私は数秒でブラウザを閉じました。同時に、私はテーブルのフィールドをチェックし、それはまだ更新されていませんが、2分後に、私はフィールドをもう一度チェックします、今回は更新されました。 –

+2

ストアドプロシージャがトランザクション処理の場合、トランザクションが完了するまでデータベースの変更は表示されません。進行状況を確認する必要がある場合は、(nolock)を使用して試すことができます。 –

1

ブラウザがまだ開いていてアクティブであるかどうかをサーバーが判断できるようにするには、タイマーajax呼び出しを使用できます。

このような場合にストアドプロシージャを停止するには、ストアドプロシージャを大幅に変更する必要があります。実際の唯一の方法は、ストアドプロシージャを実行し続ける必要があることを示すためにパラメータをデータベースに格納し、ストアドプロシージャ全体でそのパラメータをチェックすることです。ブラウザーが閉じている場合は、このパラメーターを更新し、ストアード・プロシージャーをこの値に基づいてロールバック/終了するように変更することができます。

しかし、これはすべて非常にわずかな利益のためにかなり複雑です...ストアドプロシージャが実行し続けるのは問題ですか?

+0

実際には関係ありません。私はちょうど何が起こっているのか把握したい! –

0

これをキャンセルするフォームをサポートする必要がある場合は、asp.netページと計算にいくつかの変更を加える必要があります。あなたの計算はフラグを検索する必要があります(結果が格納されたテーブルと同じテーブル内にあるかもしれません)。

次に、コード内で、プロシージャの実行を非同期で起動する必要があります。さて、クリーンな作業を行うためには、ページ全体を非同期で処理し、定期的に目を覚ます必要があり、Request.IsClientConnectedをチェックし、接続されていない場合は、フラグを設定して計算をキャンセルします。

これはかなりの仕事であり、間違いやすいものです。また、これを実装するための戦略は、アプリケーションが10人のユーザーまたは1,000人のユーザーをサポートする必要があるかどうかによって大きく異なります(アプリケーションのスケーラビリティを制限したり、IsClientConnectedどのような計算から打ち切るのですか?)

関連する問題