.Net 애플리케이션과 COM+ 개체 간에 트랜잭션을 공유할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/21589

문제

나는 얼마 전에 몇 가지 테스트를 수행했지만 이 작업을 수행하는 방법을 전혀 알지 못했습니다.

성분:

  • COM+ 트랜잭션 개체(VB6에서 개발)
  • IIS의 .Net 웹 애플리케이션(트랜잭션 포함)은 다음과 같습니다.
    COM+ 구성 요소를 호출합니다.
    SQL 데이터베이스의 행을 업데이트합니다.

테스트:

.Net 애플리케이션을 실행하고 예외를 강제로 발생시킵니다.

결과:

.Net 애플리케이션에서 수행된 업데이트가 롤백됩니다.
COM+ 개체에 의한 업데이트는 롤백되지 않습니다.

이전 ASP 페이지에서 COM+ 개체를 호출하면 롤백이 작동합니다.

어떤 사람들은 "뭐야?!COM+와 .Net에 대해 정신이 없나 보군요!" 그러나 이 세상에는 아직도 COM+ 구성 요소가 많이 남아 있는 곳이 있습니다.누군가가 이런 상황에 직면한 적이 있는지, 그리고 당신이 이 작업을 수행하는 방법을 알아냈는지 궁금합니다.

도움이 되었습니까?

해결책

VB와 .NET은 서로 다른 SQL 연결을 사용하므로(ADO와 ADO.NET이 동일한 연결을 공유하도록 할 수 있는 방법은 없음) 유일한 가능성은 DTC(Distributed Transaction Coordinator)를 참여시키는 것입니다.DTC는 두 개의 독립적인 트랜잭션을 조정하여 함께 커밋하거나 롤백하도록 합니다.

.NET에서, EnterpriseServices는 DTC와 같은 COM+ 기능을 관리합니다..NET 2.0 이상에서는 System.Transactions 네임스페이스를 사용할 수 있어 상황이 좀 더 좋아졌습니다.나는 다음과 같은 것이 작동할 것이라고 생각합니다(테스트되지 않은 코드):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

나는 현시점에서 더 많은 조언을 드릴 만큼 이 문제에 대해 잘 알지 못합니다.

COM+ 측에서, 분산 트랜잭션을 사용(대개 "필요")하도록 개체를 구성해야 합니다.COM+ 탐색기에서 개체의 속성, 선택 거래 탭을 클릭하고 "필수의".코드에서도 이 작업을 수행할 수 있는지 기억이 나지 않습니다.VB6은 COM+가 출시되기 전에 만들어졌기 때문에 COM+가 수행하는 모든 기능을 완벽하게 지원하지는 않습니다(VB6의 트랜잭션 지원은 MS Transaction Server라고 불리는 COM+의 이전 버전을 위한 것이었습니다).

모든 것이 올바르게 작동한다면 COM+ 개체는 .NET 코드로 생성된 기존 컨텍스트에 등록되어야 합니다.

"구성 요소 서비스"의 "Distributed Transaction Coordinator ransaction List" 노드를 사용하면 호출 중에 생성되는 분산 트랜잭션을 확인하고 볼 수 있습니다.

트랜잭션이 커밋될 때까지 .NET 측의 데이터 쿼리에 반영된 COM+ 구성 요소의 변경 사항을 볼 수 없다는 점에 유의하십시오!실제로 교착상태가 발생할 수 있습니다!DTC에서는 두 트랜잭션이 쌍을 이루는지 확인하지만 여전히 별도의 데이터베이스 트랜잭션이라는 점을 기억하세요.

다른 팁

이것을 어떻게 구현하고 있나요?EnterpriseServices를 사용하여 .NET 트랜잭션을 관리하는 경우 두 트랜잭션 모두에 동일한 컨텍스트를 사용하고 있으므로 두 트랜잭션 모두 롤백되어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top