2017-03-15 18 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 물건) :

<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> 

나는 아래에 있었다를

BaseSqlAccess sqlAccess = factory.CreateSqlAccess("stp_update"); 
sqlAccess.AddParameter("values", values); 

sqlAccess.ExecuteNonQuery(); 

이 계약 바인딩은 다음과 같은 특성이 있습니다 인상 만약 내가 Task.WhenAll 후에 롤백을 시작 롤백, 나는 또한 service2에 오류를 던지려고했는데 service1 여전히 뒤에 롤백이 없습니다.

무엇이 여기에 있습니까?

몇 가지

가 참고 :

  • DATAACCESS은 각 서비스는 별도의 두 DB의
+0

죄송합니다. 내 잘못 – stuartd

+0

끝점을 의미하는 서버 쪽 코드를 표시 할 수 있습니까? 이러한 메소드에도 관련있는 주석이 있습니다. 또한 클라이언트 쪽 바인딩 구성을 보여줍니다. –

+0

@ScottChamberlain 서비스 끝점을 구현하는 API에 대한 구성 데이터를 추가했습니다. – RichardMc

답변

1

에 연결되는 프로세서 수

  • 를 실행 내가 문제가 당신이 가지고 있다는 것입니다 생각하지 를 기인 TransactionScopeRequired가 true 인 WCF 서비스의 구현. herehere이에

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

    더.

  • +0

    이것은 코딩 측면에서 수정 한 것 같습니다. 아직 서버 자체에 일부 MSDTC 구성 문제가있는 것 같습니다. 감사. – RichardMc