トランザクションスコープのタイムアウトに関する私の現在の理解。
トランザクションが設定されたタイムアウト時間よりも長く実行されている場合、transaction.complete() が呼び出されたときに例外がスローされます。そのため、トランザクション内の処理が X 分間続いた場合でも、transaction.complete が呼び出されるまで X 分待たなければなりません。
この場合、Web サービス内から transactionscope を使用しています。Web 要求のエンド ユーザーは、トランザクションが中止されて例外が発生するまで X 分間待機する必要があります。
ただし、HttpWebRequest の既定のタイムアウトは 100 秒です (msdn による)。クライアントは 100 秒でタイムアウトするため、トランザクション スコープのタイムアウトは 1 分です。これにより、データベースの一貫性が保証されます。
タイムアウトに関する私の理解は正しいですか?
質問: エンド ユーザーがトランザクションの結果を知るまでの時間を最小限に抑えたいと考えています。レイテンシを最小限に抑えるために、ネストされたトランザクション スコープを使用してコードを分割することにしました。それぞれのタイムアウトは、たとえば 15 秒です。子トランザクションに 15 秒以上かかっている場合は、トランザクション全体を中止します。
ここでは、子トランザクションのタイムアウトが無視されているようです。親トランザクションのタイムアウトが呼び出された後にのみ例外が発生します。次のコードでは、ChildTransaction() は常に true を返します。レイテンシを最小限に抑えるために推奨されるアプローチは何ですか? コードは、コードがよりクリーンになるように、デフォルトのタイムアウトが 1 分であることを示しています。
internal bool RootTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
bool result = ChildTransaction();
//The result is always true.
if (!result)
return result;
for (int counter = 0;counter <= 10;counter++)
{
//Either sleep OR do some processing
System.Threading.Thread.Sleep(5000);
//
//Dosomeprocess()
}
transaction.Complete();
return true;
}
catch (Exception e)
{
return false;
}
}
}
internal bool ChildTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
//Sleep for 70 seconds
System.Threading.Thread.Sleep(70000);
transaction.Complete();
}
catch (Exception e)
{
return false;
}
}
return true;
}