2011-02-23 7 views
1

シナリオ:TransactedReceiveScope - トランザクションコミットはいつですか?

トランザクションフローを使用しないクライアントを持つwcfワークフローがあります。 ワークフローには、一連の順次TransactedReceiveScopes(コンテンツベースの相関を使用)が含まれています。 TransactedReceiveScopesにはカスタムdb操作が含まれています。

観察:

我々は最初の呼び出しに対してSQLプロファイラを実行すると、我々はすべてのカスタムDBの呼び出しを参照し、プロファイルトレースでSaveInstanceコール。

SendReplyがTransactedReceiveScopeの最後にある場合でも、トランザクションがコミットされる前にsendreplyが10秒間実行されることがあることに気付きました。

TimeToPersistとTimeToUnloadをゼロに変更しようとしましたが、それは効果がありませんでした。 (トレースには、とにかに起こったSaveInstanceが表示されますが、コミットは遅れているようです)。

質問:

私たちの観察は正しいですか?

トランザクションはいつ実行されますか?これはガベージコレクションのようなものですか?つまり、ビジー状態ではないのに後でコミットしますか?

コミット遅延を制御する方法はありませんか、クライアントからトランザクションフローを使用するためにこれを行う唯一の方法です(ancは、クライアントがコミットしたときにコミットする必要があります。

答えて

1

TransactedReceiveScopeは、ボディが完了した時点でトランザクションをコミットしますが、すべての実行はしばらく後にスケジューラを介して実行されるため、トランザクションがコミットされます。ガベージコレクションには関係なく、実行中のキューに入っている可能性のある忙しいマシンや他の多くの並列アクティビティを避けるために、実際に影響を与える方法はありません。

+0

ありがとうMaurice。私はまだ、あなたがすべてのSQL呼び出しをsaveinstanceを含むプロファイラで見ることが奇妙であると感じると、それはクライアントに戻りますが、コミットする前にまだ遅れています。私はスケジューラを読む必要がある、私はそれについてはあまり言及していない。唯一の解決策は、クライアントがトランザクションに追加する作業がなくても、クライアントからのTransactionFlowを使用してトランザクションのコミットを制御することです。 – jimasp

+0

これを読んでいるもう1つのポイントは、クライアントがトランザクションをワークフローに流していない場合、ほとんどの場合、間にトランザクションスコープを持つ標準のreceive/sendreplyが必要なことです。 – jimasp

関連する問題