엔터프라이즈 서비스 및 COM+ 트랜잭션과의 상호 운용성

System.Transactions 네임스페이스는 이 네임스페이스를 사용하여 만든 트랜잭션 개체와 COM+를 통해 만든 트랜잭션 간의 상호 운용성을 지원합니다.

EnterpriseServicesInteropOption 인스턴스를 만들어 COM+와의 상호 운용성 수준을 지정하는 경우 TransactionScope 열거를 사용할 수 있습니다.

기본적으로 애플리케이션 코드에서 정적 Current 속성을 확인할 때 System.Transactions는 그렇지 않을 경우 현재 상태인 트랜잭션이나 Currentnull임을 나타내는 TransactionScope 개체를 찾으려고 합니다. 찾을 수 없으면 System.Transactions에서 트랜잭션에 대해 COM+ 컨텍스트를 쿼리합니다. System.Transactions는 COM+ 컨텍스트에서 트랜잭션을 찾을 수 있는 경우에도 System.Transactions의 기본 트랜잭션을 선호합니다.

상호 운용성 수준

EnterpriseServicesInteropOption 열거는 None, FullAutomatic의 상호 운용성 수준을 정의합니다.

TransactionScope 클래스는 EnterpriseServicesInteropOption을 매개 변수로 받아들이는 생성자를 제공합니다.

이름에서 알 수 있듯이 NoneSystem.EnterpriseServices 컨텍스트와 트랜잭션 범위 간에 상호 운용성이 없음을 의미합니다. TransactionScope을 사용하여 None 개체를 만든 후 Current를 변경하면 COM+ 컨텍스트에 변경 내용이 반영되지 않습니다. 마찬가지로 COM+ 컨텍스트에서 트랜잭션을 변경하면 Current에 변경 내용이 반영되지 않습니다. 추가 동기화 작업이 필요하지 않으므로 이는 System.Transactions에 대한 가장 빠른 작업 모드입니다. NoneTransactionScope을 매개 변수로 받아들이지 않는 모든 생성자와 관련해서 EnterpriseServicesInteropOption가 사용하는 기본값입니다.

System.EnterpriseServices 트랜잭션을 앰비언트 트랜잭션과 결합하려면 Full 또는 Automatic을 사용해야 합니다. 두 개의 값은 모두 구성 요소가 없는 서비스라는 기능을 사용하므로 사용 시 Windows XP 서비스 팩 2 또는 Windows Server 2003에서 실행해야 합니다.

FullSystem.TransactionsSystem.EnterpriseServices에 대한 앰비언트 트랜잭션이 항상 같도록 지정합니다. 그 결과 새 System.EnterpriseServices 트랜잭션 컨텍스트를 만들고 TransactionScope에 대한 최신 트랜잭션을 적용하여 해당 컨텍스트의 최신 상태가 되도록 합니다. 이 경우 Current의 트랜잭션이 Transaction의 트랜잭션과 완전히 동기화됩니다. 이 값을 사용하면 새 COM+ 컨텍스트를 만들어야 할 수 있으므로 성능이 저하됩니다.

Automatic은 다음 요구 사항을 지정합니다.

  • Current를 선택하면 System.Transactions에서 기본 컨텍스트가 아닌 컨텍스트에서 실행 중인 COM+ 컨텍스트의 트랜잭션을 지원해야 합니다. 기본 컨텍스트에는 트랜잭션이 포함될 수 없습니다. 따라서 기본 컨텍스트에서는 Automatic을 사용하는 경우에도 System.Transactions에 대해 Current가 사용하는 스레드 로컬 스토리지에 저장된 트랜잭션이 반환됩니다.

  • 기본 컨텍스트가 아닌 컨텍스트에서 새 TransactionScope 개체를 만드는 경우 TransactionScope 개체에 대한 최신 트랜잭션이 COM+에 반영되어야 합니다. 이 경우 Automatic은 새 COM+ 컨텍스트를 만든다는 점에서 Full처럼 동작합니다.

또한 CurrentFullAutomatic에서 모두 설정된 경우 두 모드에서 Current를 직접 설정할 수 없음을 의미합니다. Current를 만드는 것 외에 TransactionScope를 직접 설정하려고 하면 InvalidOperationException이 발생합니다. EnterpriseServicesInteropOption 열거형 값은 사용할 값을 명시적으로 지정하지 않는 새 트랜잭션 범위에 의해 상속됩니다. 예를 들어 TransactionScope을 사용하여 새 Full 개체를 만든 다음 두 번째 TransactionScope 개체를 만드는 경우 EnterpriseServicesInteropOption 값을 지정하지 않으면 두 번째 TransactionScope 개체에도 Full이 설정됩니다.

요약하면 새 트랜잭션 범위를 만드는 경우 다음 규칙이 적용됩니다.

  1. Current를 확인하여 트랜잭션이 있는지 검토합니다. 이 검사로 인해 다음 작업이 수행됩니다.

  2. TransactionScopeOption 생성자가 전달한 TransactionScope 열거형 값이 검사됩니다. 이 값에 따라 새 트랜잭션을 만들지 여부가 결정됩니다.

  3. 새 트랜잭션을 만드는 경우 EnterpriseServicesInteropOption의 값에 따라 다음 작업이 수행됩니다.

    • Full: COM+ 컨텍스트와 연결된 트랜잭션이 만들어집니다.

    • None: System.Transactions 트랜잭션이 만들어집니다.

    • Automatic: COM+ 컨텍스트가 있는 경우 트랜잭션이 만들어져 컨텍스트에 연결됩니다.

다음 표에서는 EnterpriseServicesInteropOption 열거를 사용하는 트랜잭션이 필요한 트랜잭션 범위 및 ES(Enterprise Services) 컨텍스트를 보여 줍니다.

ES 컨텍스트 None 자동 전체
기본 컨텍스트 기본 컨텍스트 기본 컨텍스트 {b>새로 만들기 트랜잭션 컨텍스트
기본값이 아닌 컨텍스트 클라이언트 컨텍스트 유지 새 트랜잭션 컨텍스트 생성 새 트랜잭션 컨텍스트 생성

다음 표에서는 System.EnterpriseServices 열거형을 사용하는 트랜잭션이 필요한 트랜잭션 범위 및 특정 EnterpriseServicesInteropOption 컨텍스트가 지정된 경우의 앰비언트 트랜잭션을 보여 줍니다.

ES 컨텍스트 None 자동 전체
기본 컨텍스트 ST ST ES
기본값이 아닌 컨텍스트 ST ES ES

앞의 테이블에서: