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

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

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



답변

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

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

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

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

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

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

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

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


답변

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

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


답변

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

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.
    }
}


답변

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

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


답변

몇 가지 검색 후 이것이 내가 착륙 한 곳이므로 여기에 아래 해결책을 게시합니다. 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 클라이언트로 전환하려는 개념은 여전히 ​​적용됩니다. 적어도 그렇게하려고 시도하는 것은 진단적일 것입니다.


답변

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

그리고 나타납니다!

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