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의
죄송합니다. 내 잘못 – stuartd
끝점을 의미하는 서버 쪽 코드를 표시 할 수 있습니까? 이러한 메소드에도 관련있는 주석이 있습니다. 또한 클라이언트 쪽 바인딩 구성을 보여줍니다. –
@ScottChamberlain 서비스 끝점을 구현하는 API에 대한 구성 데이터를 추가했습니다. – RichardMc