transactionScopeのロールバックを取得できません。何かが見つからないか、transactionScopeの目的を誤解しています。非同期wcfサービスを使用するTransactionScope
私は2つのWCFサービスの呼び出しなっている次のような方法があります。各サービスの操作は、次の属性があり
public async Task<IHttpActionResult> Put(IEnumerable<string> values)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
Task task1 = service1.UpdateAsync(values);
Task task2 = service2.UpdateAsync(values);
await Task.WhenAll(task1 , task2);
scope.Complete();
}
return Ok();
}
を:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void Update(IEnumerable<string> values);
(どちらも同じ)実際のサービス
をpublic void Update(IEnumerable<string> values)
{
foreach (string value in values)
{
db1Access.Update(value);
}
}
SqlAccess(これは私たちが使用しているライブラリです。基本的にあなたのパンとbこの背後に全くのIDbCommandのもの):
BaseSqlAccess sqlAccess = factory.CreateSqlAccess("stp_update");
sqlAccess.AddParameter("values", values);
sqlAccess.ExecuteNonQuery();
契約に結合すると、次の属性があります。サービスエンドポイントを実装
<wsHttpBinding>
<binding name="WSHttpCommonBinding" transactionFlow="true">
</binding>
</wsHttpBinding>
APIのconfig:
<bindings>
<wsHttpBinding>
<binding name="CommonBindingConfiguration" transactionFlow="true" maxReceivedMessageSize="2000000"/>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:56084/service2.svc" binding="wsHttpBinding" bindingConfiguration="CommonBindingConfiguration" contract="IService1" name="IService1EndPoint"/>
<endpoint address="http://localhost:56084/service2.svc" binding="wsHttpBinding" bindingConfiguration="CommonBindingConfiguration" contract="IService2" name="IService2EndPoint"/>
</client>
私は下にあったがもし私がTask.WhenAllの後にエラーをスローすると、ロールバックを開始します。また、service2でエラーをスローしようとしましたが、service1は引き続き実行され、ロールバックはありません。
私はここで何が欠けていますか?
注意すべきいくつかのこと:
- DATAACCESSは、各サービスは、私は問題はあなたがはに帰属していないということであると考えている二つの別々のDBの
ごめんなさい申し訳ございません – stuartd
エンドポイントを含めるサーバー側にコードを表示できますか。これらのメソッドにも関連する注釈があります。また、クライアント側のバインド設定も表示してください。 –
@ScottChamberlainサービスエンドポイントを実装するAPIのコンフィグレーションデータを追加しました – RichardMc