2017-03-15 8 views
0

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の
+0

ごめんなさい申し訳ございません – stuartd

+0

エンドポイントを含めるサーバー側にコードを表示できますか。これらのメソッドにも関連する注釈があります。また、クライアント側のバインド設定も表示してください。 –

+0

@ScottChamberlainサービスエンドポイントを実装するAPIのコンフィグレーションデータを追加しました – RichardMc

答えて

1

に接続された手続きオブジェクト

  • を実行していますTransactionScopeRequiredをtrueに設定したWCFサービスの実装。

    [OperationBehavior(TransactionScopeRequired = true)] 
    public void Update(IEnumerable<string> values) 
    { 
        foreach (string value in values) 
        { 
         db1Access.Update(value); 
        } 
    } 
    

    これに関する詳細hereおよびhere

  • +0

    これはコーディングの観点から見て、サーバ自体にいくつかのMSDTC設定の問題があるようです。ありがとう。 – RichardMc

    関連する問題