풀화해야 하는 트랜잭션 구성 요소에는 특별한 요구 사항이 있습니다.
수동으로 리소스 등록
트랜잭션에 참여하는 풀 가능 개체는 관리되는 리소스를 수동으로 등록해야 합니다. 개체가 클라이언트 간에 관리되는 리소스를 보유하는 경우 지정된 컨텍스트에서 개체가 활성화될 때 리소스 관리자가 트랜잭션에 자동으로 등록할 수 있는 방법은 없습니다.
개체 자체는 트랜잭션을 검색하고, 리소스 관리자의 자동 인리스트먼트를 해제하고, 보유한 리소스를 수동으로 등록하는 논리를 처리해야 합니다. 이 작업을 수행하는 단계는 사용 중인 리소스 관리자에 따라 다릅니다. 수동 인리스트먼트를 수행해야 하는 경우 리소스 관리자에 대한 설명서를 참조하세요.
아래 설명된 대로 트랜잭션이 활성화된 동안 개체를 트랜잭션 선호도로 풀화할 수 있으며 해당 트랜잭션과 연결된 클라이언트에서 호출하는 경우 트랜잭션 선호도를 사용하여 활성화할 수 있습니다. 리소스를 등록하기 전에 먼저 트랜잭션 선호도를 확인해야 합니다. 개체가 해당 트랜잭션과 관련된 풀에서 가져온 경우 해당 트랜잭션에서 이미 작업을 수행하고 해당 리소스를 등록했습니다.
자동 인리스트먼트 해제
리소스를 획득한 후 일반적으로 개체의 생성자에서 자동 인리스트먼트를 해제해야 합니다. 즉, 자동 인리스트먼트를 사용하지 않도록 설정한 다음 연결합니다.
자동 인리스트먼트를 사용하지 않도록 설정하는 것은 특히 계층화된 데이터 액세스 공급자의 경우 미묘한 절차가 될 수 있습니다. 자동 인리스트먼트는 ODBC와 마찬가지로 연결 풀링과 결합되기도 하고 OLE DB와 마찬가지로 연결 풀링과 결합되지 않을 수 있습니다. 여러 수준의 공급자에서 자동 인리스트먼트가 해제되어 있는지 확인해야 할 수 있습니다.
IObjectControl 구현
트랜잭션에 참여하는 풀 가능 개체는 보유 중인 리소스의 현재 상태를 모니터링해야 합니다. 개체가 다시 사용할 수 없는 상태(예: 연결이 잘못된 경우)에 있는 것을 감지하면 IObjectControl::CanBePooled대해 False를 반환해야 합니다. 이렇게 하면 개체 인스턴스를 삭제하고 현재 트랜잭션을 종료하는 효과가 있습니다.
Transaction-Specific 풀
개체 풀은 일반적으로 균일하며, 현재 사용되지 않는 풀의 개체는 언제든지 클라이언트에게 반환할 수 있습니다. 이 규칙의 유일한 예외는 개체 풀링이 최적화된 트랜잭션 개체의 경우입니다. 개체를 요청하는 클라이언트에 연결된 트랜잭션이 있는 경우 COM+는 풀에서 해당 트랜잭션과 이미 연결된 사용 가능한 개체를 검색합니다. 트랜잭션 선호도가 있는 개체가 발견되면 클라이언트에 반환됩니다. 그렇지 않으면 일반 풀의 개체가 반환됩니다.
이러한 방식으로 특정 서브풀은 특정 트랜잭션에 대한 선호도를 가진 개체를 포함하는 유지 관리됩니다. 트랜잭션이 종료되면, 이러한 개체는 트랜잭션 관련 없이 모든 클라이언트가 사용 가능한 상태로 일반 풀로 반환됩니다.
이러한 이유로 구성 요소가 관리되는 리소스를 트랜잭션에 수동으로 등록하는 경우 먼저 해당 리소스가 이미 등록되었는지 확인해야 합니다. 그렇다면 등록할 필요가 없습니다.
관련 항목