이 항목에서는 성능을 최적화하기 위해 인프라에서 System.Transactions 제공하는 메커니즘에 대해 설명합니다.
승격 가능한 단일 단계 인리스트먼트
인프라는 System.Transactions 최대 단일 지속성 리소스 또는 여러 휘발성 리소스를 포함하는 단일 애플리케이션 도메인 내의 트랜잭션을 관리합니다. 인프라는 System.Transactions 애플리케이션 내 도메인 호출만 사용하므로 최상의 처리량과 성능을 제공합니다.
그러나 트랜잭션이 동일한 컴퓨터의 다른 애플리케이션 도메인(프로세스 및 컴퓨터 경계를 넘어 포함)의 다른 개체에 제공되거나 다른 지속성 리소스 관리자 System.Transactions 를 참여시키는 경우 인프라는 MSDTC에서 관리할 트랜잭션을 자동으로 에스컬레이션합니다. MSDTC에서 관리하는 트랜잭션은 인프라에서 관리하는 System.Transactions 트랜잭션만큼 성능이 좋지 않습니다.
성능을 최적화하기 위해 인프라는 다른 애플리케이션 도메인, System.Transactions 프로세스 또는 컴퓨터에 있는 단일 원격 지속성 리소스가 MSDTC 트랜잭션으로 에스컬레이션되지 않고 트랜잭션에 System.Transactions 참여할 수 있도록 하는 PSPE(승격 가능한 단일 단계 인리스트먼트)를 제공합니다. 이 RM(리소스 관리자)은 필요한 경우 나중에 분산 트랜잭션(또는 MSDTC 트랜잭션)으로 에스컬레이션할 수 있는 트랜잭션을 호스트하고 "소유"할 수 있습니다. 이렇게 하면 MSDTC를 사용할 가능성이 줄어듭니다.
이 특정 리소스 관리자는 일반적으로 자체 내부 비 분산 트랜잭션을 가지고 있으며 런타임 시 해당 트랜잭션을 분산 트랜잭션으로 변환하도록 지원해야 합니다. 예를 들어 SQL Server 2005는 이러한 리소스 관리자입니다. 이러한 경우 인프라는 System.Transactions 트랜잭션을 모니터링하여 에스컬레이션이 필요한 경우 수동 관리 역할을 수행합니다. 인프라와 리소스 관리자 간의 상호 작용을 System.Transactions 지원하려면 후자는 인터페이스 IPromotableSinglePhaseNotification를 구현해야 합니다.
이 EnlistPromotableSinglePhase 메서드는 나중에 에스컬레이션할 수 있는 단일 지속성 리소스를 등록하는 데 사용됩니다. 이 메서드는 필요에 따라 인리스트먼트를 에스컬레이션할 수 있도록 합니다. 인리스트먼트에 성공하면 RM은 내부 트랜잭션을 만들고 이를 System.Transactions 트랜잭션과 연결합니다. PSPE 인리스트먼트가 실패하는 경우 RM은 대신 메서드를 EnlistDurable 사용하여 등록해야 합니다. 트랜잭션이 이미 분산 트랜잭션이거나 다른 RM이 이미 PSPE 인리스트먼트를 수행한 경우 PSPE에 등록하지 못할 수 있습니다.
등록되면 트랜잭션을 커밋하거나 중단하는 클라이언트의 System.Transactions 호출은 메서드 또는 SinglePhaseCommit 각각을 호출하여 Rollback Resource Manager의 호출로 변환됩니다.
트랜잭션에 에스컬레이션이 System.Transactions 필요하지 않은 경우 트랜잭션이 커밋되면 RM이 알림을 받습니다 SinglePhaseCommit . 그런 다음 처음에 만든 내부 트랜잭션을 커밋할 수 있습니다.
트랜잭션을 System.Transactions 에스컬레이션해야 하는 경우(예: 여러 RM을 지원하기 위해), System.Transactions가 Promote 메서드를 호출하여 리소스 관리자에게 알립니다. 이 호출은 ITransactionPromoter 인터페이스에서 파생된 IPromotableSinglePhaseNotification 인터페이스를 통해 이루어집니다. 그런 다음 리소스 관리자는 내부적으로 트랜잭션을 로컬 트랜잭션(로깅 필요 없음)에서 DTC 트랜잭션에 참여할 수 있는 트랜잭션 개체로 변환하고 이미 완료된 작업과 연결합니다. 트랜잭션을 커밋하라는 메시지가 표시되면 트랜잭션 관리자는 여전히 리소스 관리자에게 알림을 보내 SinglePhaseCommit 며, 이 알림은 에스컬레이션 중에 만든 분산 트랜잭션을 커밋합니다.
비고
TransactionCommitted 에스컬레이션된 트랜잭션에서 커밋이 호출될 때 생성되는 추적에는 DTC 트랜잭션의 활동 ID가 포함됩니다.
관리 에스컬레이션에 대한 자세한 내용은 트랜잭션 관리 에스컬레이션을 참조하세요.
트랜잭션 관리 에스컬레이션 시나리오
다음 시나리오에서는 네임스페이스를 리소스 관리자의 '프록시'로 사용하여 System.Data 분산 트랜잭션으로 에스컬레이션하는 방법을 보여 줍니다. 이 시나리오에서는 트랜잭션과 관련된 데이터베이스 CN1에 이미 하나의 System.Data 연결이 있고 애플리케이션이 다른 System.Data 연결인 CN2를 포함하려고 하는 것으로 가정합니다. 트랜잭션은 전체 분산 2단계 커밋 트랜잭션으로 DTC에 상향 조정되어야 합니다.
이 시나리오에서는
CN1은 메서드를 EnlistPromotableSinglePhase 호출하여 트랜잭션에 참여합니다. 그런 다음 트랜잭션이 여전히 로컬이며 트랜잭션에 승격 가능한 다른 인리스트먼트가 없으므로 호출이 EnlistPromotableSinglePhase 성공합니다.
두 번째 연결인 CN2가 EnlistPromotableSinglePhase를 호출할 때, 승격 가능한 인리스트먼트가 또 있어서 호출이 실패합니다. 이 때문에 CN2는 SQL에 전달하기 위해 DTC 트랜잭션을 가져와야 합니다. 이렇게 하려면 클래스에서 제공하는 TransactionInterop 메서드 중 하나를 사용하여 SQL에 제공할 수 있는 트랜잭션 형식을 생성합니다.
CN1이 구현한 System.Transactions 인터페이스에서 Promote가 ITransactionPromoter 메서드를 호출합니다.
이 시점에서 CN1은 SQL 2005 및 System.Data에 특정한 몇 가지 메커니즘을 사용하여 트랜잭션을 에스컬레이션합니다.
메서드의 Promote 반환 값은 트랜잭션에 대한 전파 토큰을 포함하는 바이트 배열입니다. System.Transactions 는 이 전파 토큰을 사용하여 로컬 트랜잭션에 통합할 수 있는 DTC 트랜잭션을 만듭니다.
이 시점에서 CN2는 트랜잭션을 SQL에 TransactionInterop 전달하여 메서드 중 하나를 호출하여 받은 데이터를 사용할 수 있습니다.
이제 둘 다 DTC 분산 트랜잭션에 참여합니다.
단일 단계 커밋 최적화
모든 업데이트가 명시적 조정 없이 수행되므로 단일 단계 커밋 프로토콜은 런타임에 더 효율적입니다. 이 최적화를 활용하려면 ISinglePhaseNotification 인터페이스를 사용하여 리소스 관리자를 구현하고, EnlistDurable 또는 EnlistVolatile 메서드를 사용하여 트랜잭션에 참여해야 합니다. 특히 EnlistmentOptions 매개 변수는 단일 단계 커밋이 수행되도록 None와 같아야 합니다.
인터페이스는 ISinglePhaseNotification 인터페이스에서 IEnlistmentNotification 파생되므로 RM이 단일 단계 커밋에 적합하지 않은 경우에도 2단계 커밋 알림을 받을 수 있습니다. RM이 TM으로부터 알림 SinglePhaseCommit을 받으면 커밋을 위한 필요한 작업을 수행하고, 트랜잭션이 커밋되거나 롤백되어야 하는 경우에는 Committed 매개 변수의 Aborted, InDoubt, 또는 SinglePhaseEnlistment 메서드를 호출하여 트랜잭션 관리자에게 해당 사실을 알려야 합니다. 이 단계에서 인리스트먼트에 대한 응답 Done 은 ReadOnly 의미 체계를 의미합니다. 따라서 다른 방법들과 함께 Done로 회신해서는 안 됩니다.
휘발성 인리스트먼트가 하나만 있고 지속성 인리스트먼트가 없는 경우 휘발성 인리스트먼트는 SPC 알림을 받습니다. 휘발성 인리스트먼트가 있고 하나의 지속성 인리스트먼트만 있는 경우 휘발성 인리스트먼트는 2PC를 받습니다. 완료되면 지속성 인리스트먼트는 SPC를 받습니다.
참고하십시오
.NET