트랜잭션 WCF 서비스를 사용하는 방법

WCF (Windows Communication Foundation)는 .Net에서 서비스를 개발하기위한 안전하고 안정적이며 확장 가능한 메시징 플랫폼입니다.

트랜잭션은 ACID 원칙 (ACID는 Atomic, Consistent, Isolated 및 Durable 작업을 나타냄)에 따라 실행되는 일련의 문입니다. 트랜잭션 블록의 작업 중 하나가 실패하면 전체 트랜잭션이 중단됩니다. 즉, 전체 트랜잭션이 실패합니다. WCF는 분산 트랜잭션 작업을 지원합니다. .Net에서 작업 할 때 효율적인 트랜잭션 관리를 위해 System.Transactions 네임 스페이스에있는 TransactionScope 클래스를 활용할 수 있습니다.

WCF 트랜잭션 구현

이 섹션에서는 트랜잭션 WCF 서비스를 만드는 방법을 살펴 봅니다. 시작하려면 두 개의 WCF 서비스를 만듭니다. 다른 프로젝트 (콘솔 또는 웹 프로젝트)를 만들어 서비스를 테스트 할 수도 있습니다. 두 개의 WCF 서비스가 생성되면 TransactionFlow 특성을 사용하여 트랜잭션의 일부가 될 작업 계약을 장식해야합니다. 이는 트랜잭션 지원을 활성화하는 데 필요합니다.

이 속성은 TransactionFlowOption 열거 형을 매개 변수로 허용합니다. TransactionFlowOption은 다음 값 중 하나를 가질 수 있습니다.

  • TransactionFlowOption.Allowed
  • TransactionFlowOption. 필수
  • TransactionFlowOption.NotAllowed

WCF로 작업 할 때 먼저 서비스 계약을 만든 다음 그 안에 서비스 작업 또는 작업 계약을 정의해야합니다. WCF에는 서비스 계약, 데이터 계약, 오류 계약, 메시지 계약 및 운영 계약과 같은 다양한 유형의 계약이 있습니다. 이 예에서는 다른 계약이 선택 사항 일 수 있으므로 서비스 계약 및 운영 계약을 사용합니다. ServiceContract는 서비스 클라이언트가 사용할 수있는 작업을 지정하는 데 사용됩니다. 이 섹션에서는 사용중인 두 WCF 서비스에 대해 두 개의 서비스 계약을 만듭니다.

다음 코드 조각은 트랜잭션 지원을 제공하기 위해 WCF 서비스 계약에서 TransactionFlow 특성을 구성하는 방법을 보여줍니다. 다른 작업 계약 (트랜잭션의 일부)에서도 동일한 작업을 수행해야합니다.

[ServiceContract]

public interface IOrderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrder(Order order);

}

각 서비스 계약에는 회선을 통해 노출되는 작업을 정의하기위한 하나 이상의 작업 계약이 있어야합니다. 운영 계약은 서비스 방법의 서명과 트랜잭션 흐름, 서비스 운영 방향 및 선택적으로 연관 될 수있는 모든 결함 계약을 정의하는 데 사용됩니다.

다음은 IOrderHeaderService 인터페이스 (서비스 계약)의 모습입니다.

[ServiceContract]

public interface IOrderHeaderService

{

    [OperationContract]

    [TransactionFlow(TransactionFlowOption.Allowed  )]

    void AddOrderHeader(OrderHeader orderHeader);

}

다음으로 OperationBehavior 특성을 사용하여 서비스 메서드가 TransactionScopeRequired로 데코 레이팅되었는지 확인해야합니다. 본질적으로 아래 코드 스 니펫에 표시된대로 작업 계약에서 TransactionScopeRequired 속성을 "true"로 설정해야합니다. TransactionScopeRequired = true 문은 서비스 작업에 실행되는 트랜잭션 범위가 필요함을 지정하는 데 사용됩니다.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrder(Order order)

{

   // Write code here to add an order record to the database

}

다른 서비스 운영에도 동일한 변경 사항이 적용됩니다.

[OperationBehavior(TransactionScopeRequired = true)]

public void AddOrderHeader(OrderHeader orderHeader)

{

   // Write code here to add an order header record to the database

}

다음 단계는 트랜잭션 흐름을 활성화하도록 서비스 구성 파일을 구성하는 것입니다. wsHttpBinding을 사용한다고 가정하고 트랜잭션 흐름 지원을 제공하도록 WCF 서비스를 구성하는 방법은 다음과 같습니다.

트랜잭션 WCF 서비스로 작업 할 때 선택적으로 신뢰할 수있는 메시징을 지정하여 통신 실패로 인해 트랜잭션이 중단 될 가능성을 희석 할 수 있습니다. 또한 방금 정의한 바인딩을 활용하도록 WCF 서비스 엔드 포인트를 적절히 구성해야합니다.

                bindingConfiguration="Transactional" contract="Services.IOrderService">

You would now need to take advantage of the TransactionScope class present in the System.Transactions namespace to call your services from within one transaction scope. Typically you can use this class to implement transaction scope for handling interdependent transactions and resolve concurrency conflicts when working with ADO.Net.

try

{

  using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))

  {

    // Write code here to call the service methods of your services here

    transactionScope.Complete();

  }

}

catch

{

  //Write code here to handle exceptions

}

And that's all you need to do. You can now execute your application and test your transactional services.