트랜잭션 관리자가 원격 / 네트워크 트랜잭션에 대한 지원을 비활성화했습니다.


86

SQL Server와 ASP.NET을 사용하고 있습니다. 다음과 같은 기능이 있습니다.

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

그러나 ' 트랜잭션 관리자가 원격 / 네트워크 트랜잭션에 대한 지원을 비활성화했습니다. '가 던져집니다.

JoinScope에 대한 설명 :

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

나는 문제없이 동일한 환경의 다른 응용 프로그램에서 이런 식으로 작업했지만 여기 에이 문제가 있습니다. 문제를 해결하려면 어떻게해야합니까?


나는 Magnus가 먼저 모든 기반을 다루 었는지 확인하기 위해 먼저 제안한 단계를 수행 한 다음 SQL Server에서 clr을 활성화한다는 설정을 제안하는 오류가 발생했습니다. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

답변:


141

"Distributed Transaction Coordinator"서비스가 데이터베이스와 클라이언트 모두에서 실행되고 있는지 확인하십시오. 또한 "네트워크 DTC 액세스", "원격 클라이언트 허용", "인바운드 / 아웃 바운드 허용"및 "TIP 사용"을 선택했는지 확인하십시오.

MS DTC 트랜잭션에 대해 네트워크 DTC 액세스를 활성화하려면

  1. 구성 요소 서비스 스냅인을 엽니 다.

    구성 요소 서비스를 열려면 시작을 클릭합니다. 검색 상자에 dcomcnfg를 입력 한 다음 Enter 키를 누릅니다.

  2. 콘솔 트리를 확장하여 네트워크 MS DTC 액세스를 활성화 할 DTC (예 : 로컬 DTC)를 찾습니다.

  3. 동작 메뉴에서 속성을 클릭합니다.

  4. 보안 탭을 클릭하고 다음과 같이 변경합니다. 보안 설정에서 네트워크 DTC 액세스 확인란을 선택합니다.

    트랜잭션 관리자 통신에서 인바운드 허용 및 아웃 바운드 허용 확인란을 선택합니다.


3
고마워요, 매그너스. 이 유형의 트랜잭션은 동일한 컴퓨터에서 작동하므로 응용 프로그램의 설정이어야합니다. 즉,이 문제는 기계와 관련이 없습니다.
Lajos Arpad

응 나는 했어. 동일한 예외가 발생합니다.
Lajos Arpad

TransactionScope 내에서 실제로 수행하는 작업과 관련이 있다고 생각합니다.
Magnus

또한이 트랜잭션이 데이터베이스 서버에 단일 요청으로 전송되기를 원하기 때문에 조인 범위가 필요합니다.
Lajos Arpad

13
트랜잭션 내부의 모든 데이터베이스 호출에 대해 동일한 열린 연결을 사용하는지 확인하십시오.
Magnus

11

나는이 문제를 간헐적으로 받고 있었고, 여기에있는 지침과 다른 곳에서 매우 유사한 지침을 따랐습니다. 모두 올바르게 구성되었습니다.

이 페이지 : http://sysadminwebsite.wordpress.com/2012/05/29/9/ 문제를 찾는 데 도움이되었습니다.

기본적으로 두 서버에서 MSDTC에 대해 중복 CID가 있습니다. HKEY_CLASSES_ROOT \ CID

참조 : http://msdn.microsoft.com/en-us/library/aa561924.aspx 섹션 MSDTC에 고유 한 CID 값이 할당되었는지 확인

저는 가상 서버로 작업하고 있으며 서버 팀은 모든 서버에 동일한 이미지를 사용하는 것을 좋아합니다. 간단한 수정이며 다시 시작할 필요가 없습니다. 그러나 DTC 서비스는 자동 시작으로 설정해야했고 다시 설치 한 후에 시작해야했습니다.


9

"연결된 서버"에서 다른 저장 프로 시저를 호출하는 저장 프로 시저가 있습니다. ssms에서 실행하면 괜찮 았지만 응용 프로그램 (Entity Framework에서)에서 호출 할 때이 오류가 발생했습니다. 이 기사는 저를 도왔고이 스크립트를 사용했습니다.

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

자세한 내용은 다음을 참조하십시오. 연결된 서버 : 파트너 트랜잭션 관리자가 원격 / 네트워크 트랜잭션에 대한 지원을 비활성화했습니다.


1
솔루션에 대한 링크는 환영하지만 답변이없는 경우에도 유용한 지 확인하십시오 . 링크 주변에 컨텍스트를 추가 하여 동료 사용자가 그것이 무엇이고 왜 존재하는지 알 수 있도록 한 다음 페이지에서 가장 관련성이 높은 부분을 인용하십시오. 대상 페이지를 사용할 수없는 경우 다시 연결합니다. 링크에 불과한 답변은 삭제 될 수 있습니다.
Petter Friberg

1
문제가 해결되었으므로 제공해 주셔서 감사합니다. 내 특정 문제를 수정하는 데 효과가 있었기 때문에 -1 표를 얻은 이유를 모르겠습니다.
Boyd P

6

내 시나리오에서는 이미 기존 연결의 TransactionScope 내에 새 연결 인스턴스를 만들려고했기 때문에 예외가 발생했습니다.

예:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}

3

에서 코멘트 대답은 "당신이 트랜잭션 내부의 모든 데이터베이스 호출에 대해 동일한 열린 연결을 사용할 수 있는지 확인 - 매그너스."

사용자는 트랜잭션에서 작업했던 데이터와 별도의 DB에 저장됩니다. 사용자를 얻기 위해 db 연결을 열면이 오류가 발생했습니다. 다른 db 연결 및 사용자 조회를 트랜잭션 범위 외부로 이동하면 오류가 수정되었습니다.


1

몇 가지 검색 후 이것이 내가 착륙 한 곳이므로 여기에 아래 해결책을 게시합니다. EF 6을 사용하여 저장 프로 시저를 호출하려고했지만 저장 프로 시저에 연결된 서버 가 활용되고 있기 때문에 비슷한 오류가 발생 했습니다.

연결된 서버 _에 대한 OLE DB 공급자 _이 (가) 분산 트랜잭션을 시작할 수 없기 때문에 작업을 수행 할 수 없습니다.

파트너 트랜잭션 관리자가 원격 / 네트워크 트랜잭션에 대한 지원을 비활성화했습니다 *

에 위로 점프 SQL 클라이언트 것은 또한 그것이 EF 일이라고 나를 위해 확인 내 문제를 해결했다.

EF 모델 생성 방법 기반 시도 :

db.SomeStoredProcedure();

ExecuteSqlCommand 기반 시도 :

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

와:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

이 코드는 짧아 질 수 있지만 디버깅과 단계별 실행에 약간 더 편리하다고 생각합니다.

나는 Sql Client가 반드시 선호되는 선택이라고 생각하지 않지만 비슷한 문제를 가진 다른 누군가가 Google에 도착하면 적어도 공유 할 가치가 있다고 생각했습니다.

위의 코드는 C #이지만 Sql 클라이언트로 전환하려는 개념은 여전히 ​​적용됩니다. 적어도 그렇게하려고 시도하는 것은 진단적일 것입니다.


흥미 롭군. VB 코드 (사용 가능한 코드 변환기가 있음)로 솔루션을 편집하고 싶을 수 있으므로 질문의 태그와 일치합니다. 그러나 그럼에도 불구하고 나는 그것을 찬성했습니다.
Lajos Arpad

1

구성 요소 서비스에서 로컬 DTC를 찾을 수없는 경우 먼저이 PowerShell 스크립트를 실행 해보십시오.

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

그리고 나타납니다!

출처 : 파트너 트랜잭션 관리자가 원격 / 네트워크 트랜잭션에 대한 지원을 비활성화했습니다.


0

다른 사람들이 같은 문제를 가지고있는 경우 :

비슷한 오류가 발생했습니다. 트랜잭션에서 여러 SQL 문을 래핑하고 있었는데 그중 하나가 연결된 서버에서 실행되었습니다 (EXEC (...) AT Server 문에서 Merge 문). 연결된 서버에 대한 별도의 연결을 열고 해당 문을 try ... catch에 캡슐화하여 문제를 해결 한 다음 catch가 트립되는 경우 원래 연결에서 트랜잭션을 중단합니다.


0

동일한 오류 메시지가 표시되었습니다. 나 변경 pooling=False;pooling=true;Max Pool Size=200연결 문자열 문제를 해결.


0

저장 프로 시저를 만드는 동안 SSMS의 연결된 서버에서이 문제가 발생했습니다.

연결된 서버에서 "분산 트랜잭션에서 승격 활성화"서버 옵션을 False로 변경했습니다.

서버 옵션 스크린 샷

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.