다음을 통해 공유


트랜잭션 내의 COM+ 관리 작업

COM+ 등록 데이터베이스(RegDB)는 COM+ 트랜잭션에 참여할 수 있는 트랜잭션된 리소스 관리자입니다. 이렇게 하면 트랜잭션 내에서 관리 작업을 수행하고 여러 컴퓨터에서 모든 구성 변경 내용을 원자성 작업으로 커밋하거나 중단할 수 있습니다. 어떤 경우에는 격리 및 차단 동작을 고려해야 하지만 이 작업을 수행하는 것이 매우 유익할 수 있으며 트랜잭션 내에서 관리 작업을 수행하면 일반 관리 프로그래밍 모델이 약간 변경됩니다.

트랜잭션 내에서 관리 작업을 수행할 때의 이점

  • **데이터의 일관성 — **트랜잭션 내에서 수행되는 관리 작업은 커밋되거나 전체적으로 중단됩니다. 그렇지 않을 수 있는 일부 비 트랜잭션 COM+ 카탈로그 리소스가 있습니다. (아래의 비 트랜잭션 COM+ 카탈로그 리소스를 참조하세요.)
  • **여러 컴퓨터에서 일관된 배포 —**여러 서버에 COM+ 애플리케이션을 배포하는 경우 모든 서버가 동일한 구성으로 유지되도록 보장할 수 있습니다.
  • **크기 조정 및 성능—**트랜잭션 내에서 여러 작업을 수행하는 경우 RegDB에 대한 모든 쓰기가 한 번에 수행됩니다. RegDB에 대한 지속형 쓰기는 비교적 비용이 많이 드는 작업입니다. RegDB에 많은 쓰기를 만드는 경우 SaveChanges를 호출할 때마다 대신 한 번에 모두 수행하면 큰 성능 이점을 얻을 수 있습니다.

RegDB의 격리 동작

적절한 데이터 일관성과 직렬화 가능한 트랜잭션을 보장하기 위해 RegDB는 트랜잭션 내에서 관리 작업을 수행할 때 특정 차단 및 격리 동작을 적용합니다.

트랜잭션 내에서 작업을 수행하는 구성 요소가 COM+ 카탈로그에 쓰기를 유발하는 메서드(예: SaveChanges, InstallApplication 또는 InstallComponent)를 호출할 때마다 현재 트랜잭션이 커밋되거나 중단될 때까지 다른 기록기가 들어오지 못하도록 차단하는 COM+ 카탈로그 서버 코드에 기록기 잠금이 적용됩니다. 즉, 작성기는 올바른 트랜잭션 선호도가 있고 현재 트랜잭션에 참여하는 경우에만 들어올 수 있습니다.

판독기 차단 되지 않습니다. 그러나 판독기에서 볼 수 있는 데이터는 해당 트랜잭션이 실제로 커밋될 때까지 트랜잭션 내에서 수행된 임시 변경 내용을 반영하지 않습니다. 해당 트랜잭션에 참여하는 모든 구성 요소는 데이터를 읽을 때 중간 데이터 상태를 볼 수 있지만 트랜잭션 외부의 모든 구성 요소는 트랜잭션이 완료된 후에만 해당 변경 내용을 볼 수 있습니다.

SaveChanges 동작

위에서 설명한 격리 동작을 달성하기 위해 RegDB는 트랜잭션 내의 구성 요소에 의해 작동하는 캐시를 효과적으로 제공합니다. 이렇게 하면 SaveChanges 메서드의 동작이 변경됩니다.

일반적으로 트랜잭션이 없으면 SaveChanges를 호출할 때 보류 중인 변경 내용이 카탈로그에 기록되고 모든 쓰기가 완료될 때까지 SaveChanges 가 반환되지 않습니다. 이렇게 하면 SaveChanges 호출이 성공적으로 반환되면 StartApplication 을 호출할 수 있으며 새 데이터로 애플리케이션을 활성화합니다.

그러나 트랜잭션 내에서 SaveChanges 는 RegDB 자체가 아닌 캐시에만 영향을 미치며 SaveChanges 는 모든 변경 내용이 RegDB에 트랜잭션으로 커밋되었는지 여부를 즉시 반환합니다. StartApplicationSaveChanges 반환 이후에 새 데이터를 사용한다는 보장은 없습니다. 이 컨텍스트에서 StartApplication 을 호출해야 하는 경우 일정 시간 동안 기다린 후 수행하는 것이 좋습니다.

트랜잭션 Time-Out 기간

트랜잭션 내에서 수많은 관리 작업을 수행하는 경우 장기 실행 트랜잭션일 수 있습니다. 이 경우 트랜잭션 제한 시간 값이 문제가 될 수 있습니다. 이는 트랜잭션을 시작하는 구성 요소에 대해 설정된 트랜잭션 제한 시간 값 또는 해당 구성 요소가 실행 중인 컴퓨터에 대한 컴퓨터 전체 시간 제한 설정에 의해 결정됩니다. 트랜잭션 내에서 많은 작업을 수행하는 경우 적절한 트랜잭션 제한 시간을 충분히 긴 값으로 설정하고 필요한 경우 완료 시 원래 설정을 복원하는 것이 좋습니다.

비 트랜잭션 COM+ 카탈로그 리소스

레지스트리, 파일 시스템 및 MSI(Windows Installer)는 트랜잭션이 아닌 COM+ 카탈로그 리소스입니다.

참고

트랜잭션을 중단하는 오류가 있는 경우 이러한 리소스에 대한 변경 내용은 롤백되지 않을 수 있습니다.

 

.msi 파일에서 기존 COM+ 애플리케이션을 설치하는 동안 오류가 발생하는 경우 애플리케이션은 Component Services 스냅인에 표시되지 않지만 프로그램 추가/제거에 표시될 수 있습니다. 이 경우 수동으로 제거해야 합니다.

시스템 중단 시 복구

트랜잭션 내에서 관리 작업을 수행하는 구성 요소가 카탈로그 서버 코드에 기록기 잠금을 보유하는 동안 중단되는 경우 다른 사용자가 카탈로그를 변경하지 못하도록 차단합니다. 이 경우 시스템 애플리케이션을 종료하고 다시 시작하여 카탈로그의 잠금을 해제할 수 있습니다.

TransactionContext 개체를 사용하여 스크립팅

트랜잭션 내에서 관리 작업을 수행하는 간단한 방법은 TransactionContext 개체를 사용하여 트랜잭션을 제어하는 것입니다. 예를 들어 다음 Visual Basic 스크립트는 애플리케이션 또는 애플리케이션을 둘 다 만들지 않도록 두 개의 새 애플리케이션을 트랜잭션 방식으로 추가하는 방법을 보여 줍니다.

Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
  
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
  
WScript.Echo "Ending"
txctx.Commit

COM+ 관리 오류 처리

COM+ 관리 카탈로그를 사용하는 소개 예제

COMAdmin 개체 개요

COM+ 카탈로그에서 컬렉션 검색

COM+ 카탈로그에 속성 설정 및 변경 내용 저장