我無法獲取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的
糟糕對不起我的不好 – stuartd
你可以在服務器端顯示暗示端點的代碼。這些方法也有相關的註釋。也顯示客戶端的綁定配置。 –
@ScottChamberlain我在API的配置數據中添加了實現服務端點的API – RichardMc