2017-03-15 103 views
0

我無法獲取transactionScope回滾,因爲我錯過了某些內容或者我誤解了transactionScope的用途。帶有異步wcf服務的TransactionScope

我有以下的方法是撥打電話兩個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的配置實現服務端點:

<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仍然沿用並且沒有回滾。

我在這裏錯過了什麼?

有幾件事情需要注意:

  • 數據訪問正在執行的特效
  • 每個服務連接到兩個獨立的DB的
+0

糟糕對不起我的不好 – stuartd

+0

你可以在服務器端顯示暗示端點的代碼。這些方法也有相關的註釋。也顯示客戶端的綁定配置。 –

+0

@ScottChamberlain我在API的配置數據中添加了實現服務端點的API – RichardMc

回答

1

我相信問題是,你有沒有歸因將TransactionScopeRequired的WCF服務實現爲true。

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

更多關於此herehere

+0

這似乎是從編碼的角度對它進行了糾正,看起來我在服務器本身上仍然存在一些MSDTC配置問題。謝謝。 – RichardMc