3

バンチを間接的にネストしたトランザクションスコープを含むコードを確認します。ネストされたトランザクションスコープでタイムアウトが処理される方法を知りたい。サンプルコードネストされたトランザクションスコープのタイムアウト

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秒のデフォルトタイムアウトを持つことを理解していますか?

答えて

2

確かに90秒ではありません。つまり、の合計はであり、ユニオンではありません。 「今30秒まで」と「60秒まで」の和集合は、単に「現在60秒まで」である。もちろん、意図的に自分自身をブロックすることで、確認するのは簡単です。 I 容疑者「すべてのタイムアウトの交差点」を意味します。この場合、問題の30秒です。最も外側のトランザクションだけがコミットする権限を持っていますが、ハイブのトランザクションは、トランザクション全体を破損する可能性があります(すべてのレベルのロールバックは最も外側のトランザクション全体をロールバックします)。

+0

30秒間スリープ状態にしました。ルートトランザクションにバブルしたタイムアウトを取得しました。ただし、コードはルートトランザクションで例外をキャッチし、それがタイムアウト前に60秒待機します。ネストされたスコープからの例外が処理されない場合、私はそれがタイムアウト例外でエラーになると確信しています。私はそのステートメントがすべてのタイムアウトの交差点を意味すると思います。もう少しテストします... – user529265

関連する問題