ServiceModel 트랜잭션 특성
WCF(Windows Communication Foundation)에서는 WCF 서비스에 대한 트랜잭션의 동작을 구성할 수 있는 세 가지 표준 System.ServiceModel 특성의 속성을 제공합니다.
TransactionFlowAttribute
TransactionFlowAttribute 특성은 클라이언트로부터 들어오는 트랜잭션을 허용하도록 서비스 계약에서 작업의 의지를 지정합니다. 해당 특성은 다음 속성과 함께 이 컨트롤을 제공합니다. 트랜잭션은 TransactionFlowOption 열거형을 사용하여 들어오는 트랜잭션이 Mandatory, Allowed인지 또는 NotAllowed인지를 지정합니다.
이 특성은 클라이언트와의 외부 상호 작용에 서비스 작업을 연관시키는 유일한 특성입니다. 다음 단원에서 설명할 특성은 작업 실행 내에서의 트랜잭션 사용과 연관된 특성입니다.
ServiceBehaviorAttribute
ServiceBehaviorAttribute 특성은 서비스 계약 구현의 내부 실행 동작을 지정합니다. 이 특성의 트랜잭션별 속성에는 다음이 포함됩니다.
TransactionAutoCompleteOnSessionClose는 세션이 닫힐 때 완료되지 않은 트랜잭션을 완료할지 여부를 지정합니다. 이 속성의 기본값은 false입니다. 이 속성이 true이고 들어오는 세션이 네트워크 또는 클라이언트 오류로 인해 닫히지 않고 올바르게 닫힌 경우, 완료되지 않은 모든 트랜잭션이 완료됩니다. 이와는 반대로, 이 속성이 false이거나 세션이 올바르게 닫히지 않은 경우에는 세션이 닫힐 때 완료되지 않은 모든 트랜잭션이 롤백됩니다. 이 속성이 true인 경우 들어오는 채널은 세션 기반이어야 합니다.
ReleaseServiceInstanceOnTransactionComplete은 기본 서비스 인스턴스가 트랜잭션 완료 시 해제되는지 여부를 지정합니다. 이 속성의 기본값은 true입니다. 다음 인바운드 메시지는 이전 인스턴스의 트랜잭션별 상태를 무시하면서 새 기본 인스턴스를 만듭니다. 서비스 인스턴스를 릴리스하는 것은 서비스가 수행하는 내부 작업이며, 클라이언트가 설정한 기존 연결 또는 세션에는 영향을 주지 않습니다. 이 기능은 COM+가 제공하는 Just-In-Time 활성화 기능에 해당합니다. 속성이 true이면 ConcurrencyMode는 Single과 같아야 합니다. 그렇지 않으면 서비스는 시작하는 동안 유효하지 않은 구성의 유효성 검사 예외를 throw합니다.
TransactionIsolationLevel은 서비스 내의 트랜잭션에 사용하도록 격리 수준을 지정합니다. 이 속성은 IsolationLevel 값 중 하나를 사용합니다. 로컬 격리 수준 속성이 Unspecified가 아닌 경우 들어오는 트랜잭션의 격리 수준은 이 로컬 속성의 설정과 일치해야 합니다. 그렇지 않으면 들어오는 트랜잭션은 거부되며 오류가 클라이언트로 보내집니다. TransactionScopeRequired가 true이고 이동한 트랜잭션이 없을 경우, 이 속성은 로컬로 만들어진 트랜잭션에 사용할 IsolationLevel 값을 결정합니다. IsolationLevel이 Unspecified이면 IsolationLevel Serializable이 사용됩니다.
TransactionTimeout은 서비스에서 만들어진 새 트랜잭션이 완료되어야 하는 시간을 지정합니다. 이 시간에 도달했는데도 트랜잭션이 완료되지 않으면 트랜잭션이 중단됩니다. TimeSpan은 TransactionScopeRequired가 true로 설정되고 새 트랜잭션이 만들어진 작업에 대한 TransactionScope 시간 제한으로 사용됩니다. 시간 제한은 트랜잭션을 만든 시점으로부터 2단계 커밋 프로토콜의 1단계를 완료할 때까지의 최대 허용 기간입니다. TransactionTimeout 속성과 transactionTimeout 구성 설정 사이에서 항상 더 낮은 값이 시간 제한 값으로 사용됩니다.
OperationBehaviorAttribute
OperationBehaviorAttribute 특성은 서비스 구현에서 메서드의 동작을 지정합니다. 이를 사용하여 작업의 특정 실행 동작을 나타낼 수 있습니다. 이 특성의 속성은 서비스 계약에 대한 WSDL(Web Service Description Language) 설명에 영향을 주지 않으며, 개발자가 구현해야 하는 일반 기능을 사용할 수 있는 순수한 WCF 프로그래밍 모델의 요소입니다.
이 특성에는 다음과 같은 트랜잭션별 속성이 있습니다.
TransactionScopeRequired는 활성 트랜잭션 범위 내에서 메서드를 실행해야 할지 여부를 지정합니다. 기본값은 false입니다. 메서드에 OperationBehaviorAttribute 특성을 설정하지 않으면 메서드가 트랜잭션에서 실행되지 않습니다. 작업에 트랜잭션 범위가 필요하지 않을 경우, 메시지 헤더 내의 모든 트랜잭션은 활성화되지 않고 OperationContext의 IncomingMessageProperties 요소로 유지됩니다. 작업에 트랜잭션 범위가 필요한 경우 트랜잭션에 대한 소스는 다음 중 하나에서 파생됩니다.
트랜잭션이 클라이언트로부터 이동해 오는 경우, 메서드는 분산된 해당 트랜잭션을 사용하여 만들어진 트랜잭션 범위에서 실행됩니다.
대기 중인 전송과 함께, 메시지를 큐에서 제거하는 데 사용하는 트랜잭션이 사용됩니다. 이 트랜잭션은 메시지의 원래 발신자가 제공한 것이 아니기 때문에 이동된 트랜잭션이 아닙니다.
사용자 지정 전송은 TransportTransactionProperty를 사용하여 트랜잭션을 제공할 수 있습니다.
위의 항목 중 트랜잭션에 대한 외부 소스를 제공하는 항목이 없는 경우, 메서드를 호출하기 전에 새 Transaction 인스턴스가 즉시 만들어집니다.
TransactionAutoComplete는 처리되지 않은 예외가 throw되지 않을 경우 메서드가 실행하는 트랜잭션을 자동으로 완료할지 여부를 지정합니다. 이 속성이 true이면 호출 인프라는 사용자 메서드가 예외를 throw하지 않고 반환할 경우 자동으로 트랜잭션을 "완료됨"으로 표시합니다. 이 속성이 false이면 트랜잭션이 인스턴스에 연결된 상태에서, 클라이언트가 이 속성이 true로 표시된 후속 메서드를 호출할 경우 또는 후속 메서드가 명시적으로 SetTransactionComplete를 호출할 경우에만 "완료됨"으로 표시됩니다. 트랜잭션에서 이러한 결과를 수행하는 데 하나라도 실패하면 "완료됨" 상태가 될 수 없으며, TransactionAutoCompleteOnSessionClose 속성을 true로 설정하지 않으면 포함된 작업도 커밋되지 않습니다. 이 속성을 true로 설정하면 세션과 함께 채널을 사용해야 하며, InstanceContextMode를 PerSession으로 설정해야 합니다.