バンチを間接的にネストしたトランザクションスコープを含むコードを確認します。ネストされたトランザクションスコープでタイムアウトが処理される方法を知りたい。サンプルコードネストされたトランザクションスコープのタイムアウト
void RootMethod()
{
//default timeout is 60 seconds
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
SomeMethod();
scope.Complete();
}
}
void SomeMethod()
{
//set timeout to 30 seconds
TimeSpan timeout = TimeSpan.FromSeconds(30);
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, timeout))
{
/* Perform transactional work here */
scope.Complete();
}
}
MSDNアメリカ - ネストされたTransactionScopeの階層で、タイムアウトは、すべてのタイムアウトの労働組合です。実際には、階層内のすべてのスコープの中で最小のタイムアウトが優先されます。
最初のステートメントはすべてのタイムアウトの結合を示しますが、2番目のステートメントはすべてのスコープの中で最小です。ネストされたスコープを持つ上記のコードは、90秒ではなく30秒のデフォルトタイムアウトを持つことを理解していますか?
30秒間スリープ状態にしました。ルートトランザクションにバブルしたタイムアウトを取得しました。ただし、コードはルートトランザクションで例外をキャッチし、それがタイムアウト前に60秒待機します。ネストされたスコープからの例外が処理されない場合、私はそれがタイムアウト例外でエラーになると確信しています。私はそのステートメントがすべてのタイムアウトの交差点を意味すると思います。もう少しテストします... – user529265