2008년 9월 4일 목요일

OLE/DB 공급자 'SQLOLEDB'이(가) 분산 트랜잭션을 시작할 수 없음

SQL Server 에서 종종 사용되는,. Linked-Server 를 사용하여 다른 SQL Server 에 접근을 하는 경우 종종 다음과 같은 오류 메시지가 나올수 있습니다.. 물론 웹서버에서도 특정 코드에서 SQL 쿼리시 Transaction 요구가 되도록 되어 있다면 이와 비슷한 오류 메시지가 나옵니다. -_-;;

ASP 페이지에서 데이터 트랜잭션을 처리하는 방법
http://support.microsoft.com/kb/299637/ko

OLE/DB 공급자 'SQLOLEDB'이(가) 분산 트랜잭션을 시작할 수 없으므로 작업을 수행할 수 없습니다.
[OLE/DB provider returned message: 지정한 트랜잭션 코디네이터에 새 트랜잭션을 기록할 수 없습니다. ]
OLE DB 오류 추적 [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].


위 오류는,. Linked-Server 로 구성된 A 서버에서 B 서버로 쿼리시,. A 서버에서는 특정 테이블에 Trigger 가 걸려있고 그 Trigger 코드내에 Linked-Server 에 Insert 를 하게 되어 있습니다. 분산쿼리시 JoinTransaction OLE DB 인터페이스를 사용 합니다.

(읽기(Select) 라면,. 상관없겠지만,..... 데이터가 변경되는 Insert, Update, Delete, alter, create, drop 등등 명시적으로 트랜잭션을 호출하지 않더라도 암시적 트랜잭션이 활성화 됩니다.)

이러한 로컬 트랜잭션이 아닌 분산 Transaction 이 가능하게 해주는 것이 바로 MSDTC(Distributed Transaction Coordinator) 입니다. A 서버와 B서버 사이에의 트랜잭션 처리를 MSDTC가 모두 알아서 해주기 때문에 신경쓸 필요가 없는 것이죠. 위의 오류는 이와 같은 MSDTC 를 활성화 또는 엑세스에 문제가 있을때 발생 합니다.




그래서 MSDTC 활성화가 필요한데,.. MSDTC 활성화에 대한 자세한 설명이 있는 아티클이 있으므로  다음 포스트를 참조하는것이 더 이로울듯 싶습니다.^^

MS-DTC Setting on Windows 2003
http://www.simpleisbest.net/archive/2005/07/04/173.aspx

(*DTC 로그온 계정의 경우 다른 계정으로 설정을 했다가 원래 계정으로 복구를 할려면 굳이 msdtc 를 재설치 할필요까지는 없습니다. NT Authority\NetworkService 계정을 넣어주면 됩니다.  여기에서 설정한 계정은 서비스 관리자의 에서 Distributed Transaction Coordinator 의 실행 계정 입니다.)

MSDTC 는,. 다른 호스트의 MSDTC 엑세스를 위해서 RPC 통신을 하게 됩니다.

Linked-Server 에서 라면,. 쿼리 업데이트를 위한 1433 말고도 MSDTC 를 위한 135 포트가 접근이 가능해야 하는데,. 인증을 하게 되어 있는 경우 컴퓨터 인증이므로 Active Directory 환경이 아니고서는 되지 않습니다.

DCEPRC
     Auth type: NTLMSSP (10)
     Auth level: Packet integrity (5)
     NTLMSSP
          NTLMSSP identifier: NTLMSSP
          NTLM Message Type: NTLMSSP_NEGOTIATE (0x00000001)

컴퓨터 인증이기 때문에,. 워크 그룹 환경에서는 인증을 이용할수 없고 다음과 같은 이벤트가 발생하게 되겠지요.

로그온 시도: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
로그온 계정: WSSPLEX-A2$
워크스테이션: WSSPLEX-A2
오류 코드: 0xC0000064

로그온 실패:
  원인:  알 수 없는 사용자 이름 또는 잘못된 암호
  사용자 이름: WSSPLEX-A2$
  도메인:  WORKGROUP
  로그온 유형: 3
  로그온 프로세스: NtLmSsp
  인증 패키지: NTLM
  워크스테이션 이름: WSSPLEX-A

물론,.  "인증 필요 없음" 이 체크되어 있더라도 Linked-Server 의 옵션에서 RPC 사용이 체크되어 있으면 RPC 로그온을 시도하게 됩니다.



만약,. 한쪽에서만 허용이 되어 있다거나 접속이 가능한 조건이 라면,. 다음과 같은 이벤트가 발생 합니다.

이벤트 형식: 경고
이벤트 원본: MSDTC
MS DTC가 원격 시스템에 있는 MS DTC와 통신할 수 없습니다. 주 시스템에 있는 MS DTC가 보조 시스템에 있는 MS DTC와 RPC 바인딩을 만들었지만 시간을 초과하기 전에 보조 시스템이 주 MS DTC 시스템으로 역방향 RPC 바인딩을 만들지 못했습니다. 두 시스템 간에 네트워크 연결이 되어 있는지 확인하십시오. 오류 설명:d:\nt\com\complus\dtc\dtc\cm\src\iomgrsrv.cpp:1318, Pid: 2680
No Callstack,
CmdLine: C:\WINDOWS\system32\msdtc.exe


MSDTC 구성에 관련해서 위의 참조 링크를 통해서도 해결이 되지 않는다면 다음 링크를 통해서 트러블 슈팅을 해보면 도움이 될것 같습니다.

Troubleshooting Problems with MSDTC
http://msdn.microsoft.com/en-us/library/aa561924.aspx

만약 오류에 의해서 트랜잭션이 실패하거나 중단되는 것은, MSTDC 트랜잭션 통계를 통해서 확인이 가능할텐데요.. 물론 이러한 통계는 msdtc 가 시작된 이후로의 통계 이므로 재시작 되면 없어 집니다.





04-msdtc-net-config.gif
04-msdtc-rpc.gif
04-msdtc-transaction.gif

댓글 없음:

댓글 쓰기

HttpClient 에서 비동기 호출시 System.Threading.Tasks.Task 오류

client.PostAsync().Result; 하나 이상의 오류가 발생했습니다., 위치: System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 이 요청을...