サービスとトランザクション
Windows Communication Foundation (WCF) アプリケーションでは、クライアントからトランザクションを開始し、そのトランザクションをサービス操作内で調整できます。クライアントはトランザクションを開始し、複数のサービス操作を呼び出す可能性があります。サービス操作が、1 つの単位としてコミットまたはロールバックされます。
サービス コントラクトでトランザクション動作を有効にするには、ServiceBehaviorAttribute を指定し、クライアント トランザクションを必要とするサービス操作について TransactionIsolationLevel プロパティと TransactionScopeRequired プロパティを設定します。TransactionAutoComplete パラメータは、未処理の例外がスローされない場合に、メソッドが実行されているトランザクションを自動的に完了するかどうかを指定します。これらの属性詳細については、 、「ServiceModel トランザクションの属性」を参照してください。
データベース更新の記録など、サービス操作で実行され、リソース マネージャで管理される作業は、クライアント トランザクションの一部です。
ServiceBehaviorAttribute 属性と OperationBehaviorAttribute 属性を使用して、サービス側のトランザクション動作を制御する方法を次の例に示します。
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService: ICalculatorLog
{
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Add(double n1, double n2)
{
recordToLog(String.Format("Added {0} to {1}", n1, n2));
return n1 + n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Subtract(double n1, double n2)
{
recordToLog(String.Format("Subtracted {0} from {1}", n1, n2));
return n1 - n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Multiply(double n1, double n2)
{
recordToLog(String.Format("Multiplied {0} by {1}", n1, n2));
return n1 * n2;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double Divide(double n1, double n2)
{
recordToLog(String.Format("Divided {0} by {1}", n1, n2));
return n1 / n2;
}
}
次のサンプル構成に示すように、WS-AtomicTransaction プロトコルを使用するようにクライアントとサービスのバインディングを構成し、<transactionFlow> 要素を true に設定することで、トランザクションとトランザクション フローを有効にできます。
<client>
<endpoint address="net.tcp://localhost/ServiceModelSamples/service"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingWSAT"
contract="Microsoft.ServiceModel.Samples.ICalculatorLog" />
</client>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingWSAT"
transactionFlow="true"
transactionProtocol="WSAtomicTransactionOctober2004" />
</netTcpBinding>
</bindings>
クライアントは、TransactionScope を作成し、トランザクションのスコープ内でサービス操作を呼び出すことにより、トランザクションを開始できます。
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do work here
ts.Complete();
}