programing

트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다.

magicmemo 2023. 5. 26. 20:51
반응형

트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다.

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

저는 같은 환경의 다른 애플리케이션에서 문제 없이 이러한 방식으로 작업했지만, 여기서 이 문제가 발생했습니다.문제를 해결하려면 어떻게 해야 합니까?

데이터베이스와 클라이언트 모두에서 "분산 트랜잭션 조정자" 서비스가 실행되고 있는지 확인합니다.또한 "네트워크 DTC 액세스", "원격 클라이언트 허용", "인바운드/아웃바운드 허용" 및 "TIP 활성화"를 선택해야 합니다.

MS DTC 트랜잭션에 대해 네트워크 DTC 액세스를 활성화하려면 다음과 같이 하십시오.

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

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

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

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

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

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

"연결된 서버"의 다른 스토어 프로시저를 호출하는 스토어 프로시저가 있었습니다.ssms로 실행하면 괜찮았지만, 애플리케이션에서 호출하면(엔티티 프레임워크별)저는 이 오류를 받았습니다.이 문서는 나와 이 스크립트를 사용하는 데 도움이 되었습니다.

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

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

내 시나리오에서는 이미 존재하는 연결의 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.
    }
}

저는 이 문제를 간헐적으로 접했고, 여기와 다른 곳의 지침을 매우 유사한 지침을 따랐습니다.모두 올바르게 구성되었습니다.

페이지: 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 서비스를 자동 시작으로 설정해야 했고 다시 설치한 후에 시작해야 했습니다.

답변의 의견: "트랜잭션 내의 모든 데이터베이스 호출에 대해 동일한 열린 연결을 사용해야 합니다.매그너스

우리의 사용자들은 제가 트랜잭션에서 작업하던 데이터와 별도의 DB에 저장됩니다.사용자를 가져오기 위해 db 연결을 여는 것이 저에게 이 오류를 일으켰습니다.다른 DB 연결 및 사용자 조회를 트랜잭션 범위 밖으로 이동하여 오류를 해결했습니다.

제가 아래의 해결책을 여기에 게시하는 이유는 제가 착륙한 곳이 이곳이기 때문에 다른 곳도 마찬가지일 수 있기 때문입니다.저장 프로시저를 호출하기 위해 EF 6을 사용하려고 했지만, 저장 프로시저에 링크된 서버가 사용되고 있어서 비슷한 오류가 발생했습니다.

연결된 서버의 OLE DB 공급자가 분산 트랜잭션을 시작할 수 없으므로 작업을 수행할 수 없습니다.

파트너 트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다*

SQL Client로 넘어가면서 문제가 해결되었습니다. 이 문제는 EF 문제라는 것도 확인할 수 있었습니다.

EF 모델 생성 메서드 기반 시도:

db.SomeStoredProcedure();

SQL 명령 기반 시도 실행:

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가 반드시 선호되는 선택이라고는 생각하지 않지만, 비슷한 문제를 가진 다른 사람이 구글에 의해 여기에 도착한다면 적어도 공유할 가치가 있다고 느꼈습니다.

위의 코드는 C#이지만 Sql Client로 전환하려는 개념은 여전히 적용됩니다.최소한 그렇게 시도하는 것이 진단적일 것입니다.

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

연결된 서버에서 "분산 트랜잭션에서 프로모션 사용" 서버 옵션을 False로 변경했습니다.

서버 옵션 스크린샷

구성 요소 서비스에서 로컬 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

그리고 그것이 나타납니다!

원본: 파트너 트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용할 수 없도록 설정했습니다.

다른 사용자가 동일한 문제를 가지고 있는 경우:

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

저도 같은 오류 메시지를 받았습니다.변화하는 나를 위해pooling=False로.;pooling=true;Max Pool Size=200연결 문자열에서 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/10130767/the-transaction-manager-has-disabled-its-support-for-remote-network-transactions

반응형