ServiceModel トランザクションの属性
Windows Communication Foundation (WCF) には、WCF サービスのトランザクションの動作を構成するための 3 つの標準 System.ServiceModel 属性のプロパティが用意されています。
TransactionFlowAttribute
TransactionFlowAttribute 属性は、クライアントから受信トランザクションを受け入れるときのサービス コントラクトにおける操作の受け入れやすさを指定します。 この属性は、次のプロパティを使用してこの制御を行います。トランザクションは、TransactionFlowOption 列挙型を使用して、受信トランザクションが Mandatory、Allowed、NotAllowed のいずれであるかを指定します。
これは、サービス操作をクライアントの外部とのやり取りに関連付ける唯一の属性です。 次のセクションで説明する属性は、操作の実行内部におけるトランザクションの使用と関連しています。
ServiceBehaviorAttribute
ServiceBehaviorAttribute 属性は、サービス コントラクト実装の内部実行動作を指定します。 この属性のトランザクション固有のプロパティは次のとおりです。
TransactionAutoCompleteOnSessionClose は、セッションの終了時に、未完了のトランザクションを完了させるかどうかを指定します。 このプロパティの既定値は、
false
です。 このプロパティがtrue
で、ネットワークまたはクライアントの障害が原因で、入力セッションが終了せずにシャットダウンした場合は、すべての未完了のトランザクションが正常に完了します。 このプロパティがfalse
の場合、またはセッションが正常に終了しなかった場合は、セッションの終了時にすべての未完了のトランザクションがロールバックされます。 このプロパティをtrue
に設定する場合、受信チャネルはセッション ベースである必要があります。ReleaseServiceInstanceOnTransactionComplete は、トランザクションが完了したときに基になるサービス インスタンスを解放するかどうかを指定します。 このプロパティの既定値は、
true
です。 次の受信メッセージによって、基になる新しいインスタンスが作成されると、以前のインスタンスが保持していたトランザクションごとの状態は破棄されます。 サービス インスタンスの解放はサービスが実行する内部動作であるため、クライアントが確立した既存の接続またはセッションに影響を及ぼすことはありません。 この機能は、COM+ に用意された Just-In-Time アクティベーション機能に相当します。 このプロパティがtrue
の場合は、ConcurrencyMode と Single を一致させる必要があります。 そうでない場合、サービスの起動中に無効な構成の検証例外がスローされます。TransactionIsolationLevel は、サービスのトランザクションで使用する分離レベルを指定します。このプロパティは、IsolationLevel の値のいずれかに設定されます。 ローカルの分離レベル プロパティが、Unspecified 以外に設定されている場合は、受信トランザクションの分離レベルをこのローカルのプロパティの設定に一致させる必要があります。 そうでない場合、受信トランザクションは拒否され、クライアントにエラーが返されます。 TransactionScopeRequired が
true
であり、トランザクションがフローしていない場合、このプロパティによって、ローカルで作成されるトランザクションに使用する IsolationLevel の値が決まります。 IsolationLevel が Unspecified に設定されている場合は、IsolationLevelSerializable が使用されます。TransactionTimeout は、サービスで作成された新しいトランザクションを完了させる期間を指定します。 この期間が過ぎてもトランザクションが完了しない場合は、トランザクションは中止されます。 TimeSpan は、TransactionScope が TransactionScopeRequired に設定された任意の操作、および新しいトランザクションが作成された任意の操作の
true
タイムアウトとして使用されます。 このタイムアウトは、2 フェーズ コミット プロトコルにおいて、トランザクションが作成されてからフェーズ 1 が完了するまでの最大許容時間です。 使用されるタイムアウト値は、TransactionTimeout プロパティとtransactionTimeout
構成設定のうち、常に小さい方の値になります。
OperationBehaviorAttribute
OperationBehaviorAttribute 属性は、サービス実装におけるメソッドの動作を指定します。 この属性を使用して、操作の特定の実行動作を示すことができます。 この属性のプロパティは、サービス コントラクトの Web サービス記述言語 (WSDL: Web Service Description Language) 記述には影響しません。また、このプロパティがない場合に開発者が実装する必要のある共通の機能を有効にする、WCF プログラミング モデルの要素にすぎません。
この属性には、次のようなトランザクション固有のプロパティがあります。
TransactionScopeRequired は、メソッドをアクティブなトランザクション スコープ内で実行する必要があるかどうかを指定します。 既定では、
false
です。 OperationBehaviorAttribute 属性がメソッドに対して設定されていない場合は、そのメソッドがトランザクション内で実行されないことを意味します。 操作のトランザクション スコープが要求されない場合、メッセージ ヘッダーにあるトランザクションはアクティブ化されず、IncomingMessageProperties の OperationContext の要素として残ります。 操作のトランザクション スコープが必要な場合は、トランザクションのソースは次のいずれかから派生します。トランザクションがクライアントからフローされた場合、その分散トランザクションを使用して作成されたトランザクション スコープの下でメソッドが実行されます。
キューに置かれたトランスポートでは、メッセージをキューから削除するトランザクションが使用されます。 使用されるトランザクションはフローされたトランザクションではなく、したがってメッセージの送信元によって提供されたものではないことに注意してください。
カスタム トランスポートは、
TransportTransactionProperty
を使用することによってトランザクションを提供できます。上記のいずれもがトランザクションの外部ソースを提供しない場合は、メソッドの呼び出しの直前に新規の Transaction インスタンスが作成されます。
TransactionAutoComplete は、未処理の例外がスローされなかった場合に、メソッドが実行されているトランザクションが自動的に完了されるかどうかを指定します。 このプロパティが
true
の場合は、ユーザー メソッドが例外をスローせずに復帰したときに、呼び出し側のインフラストラクチャが自動的にそのトランザクションを "完了" としてマークします。 このプロパティがfalse
の場合、トランザクションはインスタンスにアタッチされ、このプロパティがtrue
とマークされた後続のメソッドがクライアントによって呼び出されるか、または後続のメソッドから SetTransactionComplete が明示的に呼び出された場合にのみ、"完了" とマークされます。 TransactionAutoCompleteOnSessionClose プロパティをtrue
に設定しない限り、これらのどちらの実行に失敗しても、トランザクションは "完了" にならなくなり、格納されている作業はコミットされません。 このプロパティがtrue
に設定されている場合、セッションのあるチャネルを使用し、InstanceContextMode を PerSession に設定する必要があります。