다음을 통해 공유


트랜잭션에서 비 트랜잭션 구성 요소 사용

트랜잭션의 ACID 속성을 활용하기 위해 트랜잭션에 비 트랜잭션 구성 요소를 배치하는 것이 유용한 경우가 많습니다. 예를 들어 네트워크에서 암호를 업데이트하는 데 사용하는 트랜잭션이 아닌 레거시 구성 요소가 있는 경우 이러한 구성 요소를 트랜잭션에 배치하여 네트워크 전체에서 암호 업데이트가 일관되도록 할 수 있습니다.

트랜잭션 컨텍스트 개체는 비 트랜잭션 클라이언트가 해당 용도로 특별히 새 구성 요소를 개발할 필요 없이 여러 COM 개체의 작업을 단일 트랜잭션으로 결합할 수 있도록 하는 제네릭 개체입니다. 자동 트랜잭션과 달리 트랜잭션 컨텍스트 개체는 클라이언트가 트랜잭션을 명시적으로 커밋하거나 중단해야 합니다.

기본적으로 트랜잭션 컨텍스트 개체의 트랜잭션 특성 값은 필수로 설정됩니다. COM+는 클라이언트가 커밋 또는 중단 호출을 명시적으로 실행하지 않고 트랜잭션 컨텍스트 개체를 해제하는 경우 트랜잭션을 중단합니다.

다음 Visual Basic 예제에서는 트랜잭션이 아닌 클라이언트가 둘 이상의 개체에 의해 수행된 작업을 단일 트랜잭션으로 구성하는 방법을 보여줍니다.

Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat  ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog  ' Cdog is a user-defined component.

' Get TransactionContext object.
Set objTxCtx = _
  CreateObject ("TxCtx.TransactionContext")

' Create instances of Cat and Dog.
Set objCat = _ 
  objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _ 
  objTxCtx.CreateInstance ("MyDLL.Cdog")

' Both objects do work.
objDog.Bark
objCat.Hiss

' Commit the transaction.
objTxCtx.Commit

트랜잭션 컨텍스트 개체의 제한 사항

다음은 트랜잭션 컨텍스트 개체의 몇 가지 중요한 제한 사항입니다.

  • 트랜잭션 컨텍스트 개체를 사용하는 경우 여러 개체의 작업을 단일 트랜잭션으로 결합하는 애플리케이션 논리는 특정 비 트랜잭션 클라이언트 구현에 연결되며 COM 구성 요소를 사용할 때의 몇 가지 이점이 손실됩니다. 이러한 손실된 이점은 다음과 같습니다.

    • 더 큰 트랜잭션의 일부로 애플리케이션 논리를 다시 사용하는 기능
    • 선언적 보안 부과
    • 클라이언트에서 원격으로 논리를 실행할 수 있는 유연성
  • 트랜잭션 컨텍스트 개체는 비 트랜잭션 클라이언트를 사용하여 In Process로 실행됩니다. 즉, 비 트랜잭션 클라이언트 컴퓨터에서 COM+를 사용할 수 있어야 합니다. 예를 들어 COM+와 동일한 서버에서 실행되는 ASP(Active Server Pages) 페이지에서 트랜잭션 컨텍스트 개체를 사용하는 경우 문제가 되지 않을 수 있습니다.

  • 트랜잭션 컨텍스트 개체를 만들 때 비 트랜잭션 클라이언트에 대한 컨텍스트를 얻지 않습니다. 트랜잭션 작업은 트랜잭션 컨텍스트 개체를 사용하여 만든 COM 개체를 통해서만 간접적으로 수행할 수 있습니다. 특히 비 트랜잭션 클라이언트는 COM+ 리소스 디스펜서(예: ODBC)를 사용할 수 없으며 트랜잭션에 작업이 포함되어 있습니다. 예를 들어 개발자는 관계형 데이터베이스 시스템에서 트랜잭션 작업을 수행하기 위한 다음 구문을 잘 알고 있을 수 있습니다.

    BEGIN TRANSACTION
      DoWork
    COMMIT TRANSACTION
    

    비슷한 방식으로 트랜잭션 컨텍스트 개체를 사용하면 원하는 결과가 생성되지 않습니다.

    Set objTxCtx = CreateObject ("TxCtx.TransactionContext")
      DoWork
      objTxCtx.Commit
    Set objTxCtx = Nothing
    

    이 예제에서 DoWork에 대한 호출은 트랜잭션에 등록되지 않습니다. 대신 DoWork를 호출하는 COM 구성 요소를 빌드하고 트랜잭션 컨텍스트 개체를 사용하여 해당 구성 요소의 instance 개체를 만든 다음, 작업이 클라이언트 제어 트랜잭션의 일부가 되도록 비 트랜잭션 클라이언트에서 해당 개체를 호출해야 합니다.