1

私の Azure Web サービスには、SQL Azure でストアド プロシージャを呼び出すコードがあります。場合によっては、ストアド プロシージャは完了しますが、その後接続が切断され、呼び出し元が次のようにSqlException要求されることがあります。Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

呼び出し元は接続を再開し、同じコードを再実行しようとします。問題は、コードが最初にデータベース テーブルに「正しい状態」が格納されていることを確認し、上記のストアド プロシージャが既に実行されているため、データベースの状態が変更されているため、チェックが失敗して例外がスローされることです。

したがって、問題は、呼び出しコードが「例外なし」が「データベース変更OK」に等しいという条件に依存しているため、例外があった場合、データベースは変更されていないことです。この場合、データベースの変更が発生した後の一時的な接続の問題が原因で例外が発生するため、想定が間違っていることが判明します。

そのような場合に対処する一般的な方法は何ですか?

4

3 に答える 3

0

問題を完全に解決する唯一の方法は、トランザクションを べきにすることです。これは、プロシージャを何度実行しても最終状態が正しい状態であると言えます。これを行うと、最初のトランザクション (または 2 番目、3 番目、4 番目など) が失敗したかどうかは問題になりません。機能するまで試行を続けるだけで、適切な状態になったことがわかります。

冪等性を正確に達成する方法は状況によって異なります。多くの場合、ガード句を使用して、既に目的の状態にあるかどうかを確認できますが、より複雑なことを行う必要がある場合もあります。

于 2012-12-11T15:38:56.723 に答える
0

Enterprise Library Transient Fault Handling Blockを使用することをお勧めします。Web ロールへの組み込みを開始しました。

于 2012-12-10T22:13:03.997 に答える
0

DTC とリモート トランザクションを使用すると、少なくともこれを適切に処理できます。それを「ローカル」から「分散」トランザクションに昇格させる必要があります。これはそれ自体に問題がありますが、これを適切に行う方法は他にほとんどありません。

または、この状況をコードで適切に処理するように再プログラムすることもできます。

于 2012-12-10T09:30:39.200 に答える