문제

현재 프로젝트에서는 Ado.net Entity 프레임 워크를 응용 프로그램의 데이터 계층으로 사용하고 있습니다. 데이터베이스에해야 할 작업이 많기 때문에 거래에서 실행 해야하는 작업이 있습니다. 나는 a를 사용하고있다 트랜잭션 스코프 그 작업을 둘러싸고 있습니다.

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    // Do something...
    transactionScope.Complete();
}

문제는 내가 사용하자마자 트랜잭션 스코프 예외가 발생합니다.

System.Data.EntityException : 기본 제공 업체가 열려 있지 않았습니다. ---> System.Transactions.TransactionManagerCommunicationException : 기본 트랜잭션 관리자와의 커뮤니케이션에 실패했습니다. ---> System.Runtime.InterOpServices.comexception (0x80004005) : 오류 HRESULT E_FAIL이 호출에서 COM 구성 요소로 반환되었습니다.

이 오류는 MSDTC (Microsoft 분산 트랜잭션 코디네이터). MSDTC의 보안 구성을 변경하면 또 다른 예외가 발생합니다.

System.Data.EntityException : 기본 제공 업체가 열려 있지 않았습니다. ---> System.Transactions.TransactionManagerCommunicationException : 분산 트랜잭션 관리자 (MSDTC)의 네트워크 액세스가 비활성화되었습니다. 컴포넌트 서비스 관리 도구를 사용하여 MSDTC의 보안 구성에서 네트워크 액세스에 대한 DTC를 활성화하십시오.

그러나 MSDTC가 구성되어 있습니다 트랜잭션 스코프 오류가 발생합니다. 누군가 여기서 무엇이 잘못되고 있는지 알고 있습니까?

도움이 되었습니까?

해결책 8

흠, 내가 바꿀 때 작동하는 것 같습니다. 거래 copeoption "억제":

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Suppress))
{
    ...
}

모두가 이유를 알고 있습니까?

다른 팁

기본적으로 MSDTC에는 네트워크 액세스가 비활성화되어 있습니다. 그것을 작동 시키려면 가야합니다

제어판> 관리 도구-> 구성 요소 서비스-> 구성 요소 Serivces-> Computes-> 내 컴퓨터-> 오른쪽 클릭-> 속성-> MSDTC-> 보안 구성

다음 확인란을 확인하십시오 네트워크 DTC 액세스, 인바운드 허용, 아웃 바운드 허용. 인증은 귀하의 환경에 따라 선택되어야합니다. 당신은 또한보고 싶을 수도 있습니다 dtcping 분산 트랜잭션을 디버그하는 도구. 바로 가기를 제공하려면 레지스트리를 수정해야 할 수도 있습니다.

hklm Software Policies Microsoft Windows NT rpcrestrictremoteclients = 0 HKLM Software Policies Microsoft Windows NT rpcenableAuthePresolution = 1

모든 것을 시작하고 실행합니다.

예, Supress를 사용하여 작동합니다. 주변 거래를 억압하거나 무시하고 새로운 지역 거래를 만들라고 지시하기 때문입니다. 트랜잭션은 로컬이므로 분산 거래가 아니므로 MSDTC를 사용하지 않지만 억제를 사용해서는 안되며 대신 필수를 사용해야합니다.

즉, 코드 블록을 입력 할 때 현재 유효 할 수있는 트랜잭션을 억제하고 있으므로 외부 "주변"트랜잭션이 롤백을 결정하는 경우 코드가 업데이트되는 모든 업데이트가 롤백되지 않습니다.

이것은 우리가 자신의 비슷한 문제를 해결하는 데 사용한 기사입니다.

MSDTC의 문제 해결 문제

이것은 기본적으로 부록입니다 Nikolay R 대답. 그는 이미 기사에 나열된 몇 가지 제안을 다루었습니다.

참고 :이 기사는 Biztalk 문서의 일부이지만 MSDTC를 사용하는 것에 적용 할 수 있습니다.

"트랜잭션과 함께 엔티티 프레임 워크를 사용하는 경우 엔티티 프레임 워크가 자동으로 열리고 각 데이터베이스 호출과 연결을 닫습니다. 따라서 트랜잭션을 사용할 때 여러 연결을 통해 트랜잭션을 확산 시키려고합니다. 이는 MSDTC로 상승합니다."

데이터베이스 컨텍스트를 Callee 클래스 또는 트랜잭션에서 기능으로 전달할 수 있습니다.

아마도 이것은 당신의 대답 일 것입니다 : MSSQL 오류 '기본 제공 업체가 오픈에 실패'

실패 할 수있는 코드를 실행하려면 거래를 억제하는 것이 유용하지만, 그 실패로 인해 거래를 중단시키고 싶지 않습니다.

자신에게 물어봐야 할 질문은 다음과 같습니다. TransactionScope에서 내구성있는 자원이 2 개 이상에 액세스하고 있습니까? 내 말은, 당신은 1dB 이상의 연결을 열어 주나요?

내구성이 뛰어난 자원에 액세스하면 거래가 DTC로 확대되므로 중요한 질문입니다.

단일 위상 알림을 지원하는 두 가지 이상의 내구성 자원이 거래에 입대됩니다. 예를 들어, 단일 연결을 입력해도 거래가 촉진되지는 않습니다. 그러나 데이터베이스에 두 번째 연결을 열면 데이터베이스가 입대하게됩니다. Transactions Infrastructure는 트랜잭션의 두 번째 내구성 자원임을 감지하고 MSDTC 트랜잭션으로 에스컬레이션합니다.원천: MSDN

이 경우 트랜잭션 스코프를 올바르게 중첩하여 문제를 해결할 수 있습니다.

//Create rootScope
using(TransactionScope rootScope = new TransactionScope()) 
{ 
    using(TransactionScope scope2 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    {
         //Do work on DB1
         ...

         //Complete this ambient transaction
         scope2.Complete();
    } 

    using(TransactionScope scope3 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    {
         //Do work on DB2
         ...

         //Complete this ambient transaction
         scope3.Complete();
    } 

    //Complete rootScope
    //The whole transaction will only be committed if you call 
    //Complete on the rootScope
    rootScope.Complete();

}

TransactionScopes, Nesting Works, ... on에 대한 추가 정보를 찾을 수 있습니다. MSDN.

이 대답이 미래의 사람들에게 도움이되기를 바랍니다.

분산 트랜잭션 코디네이터 서비스가 시작되지 않으면 엔티티 프레임 워크가 데이터베이스에 연결할 수 없습니다. 분산 거래 코디네이터를 열고 시작하십시오

서비스 -> 분산 거래 코디네이터

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