DB/MS-SQL

분산 트랜잭션 설정

채윤아빠 2009. 4. 4. 13:03
728x90
반응형
다음과 같이 분산 트랜잭션을 응용하여 저장 프로시저의 결과를 임시 테이블 변수에 집어 넣는 예제입니다.
CREATE TABLE dbo.EMPLOYEE_SALES
(
  data_source   VARCHAR(20) NOT NULL,
  employee_id   VARCHAR(11) NOT NULL,
  last_name     VARCHAR(40) NOT NULL,
  sales_dollars MONEY NOT NULL
);

INSERT EMPLOYEE_SALES 
EXECUTE SOURCE.PUBS.dbo.usp_get_employee_sales

DTC가 제대로 설정되어 있지 않으면, 다음과 같은 오류가 발생합니다.

 연결된 서버 "SOURCE"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "활성 중인 트랜잭션이 없습니다."을(를) 반환했습니다.
메시지 7391, 수준 16, 상태 2, 줄 14
연결된 서버 "SOURCE"의 OLE DB 공급자 "SQLNCLI"이(가) 분산 트랜잭션을 시작할 수 없으므로 요청한 작업을 수행할 수 없습니다.

분산 트랜잭션을 수행하기 위해서는 반드시 DTC 서비스가 정상적으로 동작할 수 있도록 환경을 구성해 주어야 합니다. Windows Server 2003을 sp1 이상 패치한 경우, 보안 설정이 강화되면서 DTC가 기본적으로 사용할 수 없도록 구성되어 있습니다. 이를 활성화 시키려면 다음과 같은 과정을 거칩니다.


1) MS DTC 서비스 활성화

관리도구의 "구성요소 서비스"를 실행시킵니다.(C:\WINDOWS\system32\Com\comexp.msc)
그러면 아래 그림과 같은 구성 요서 서비스 관리자가 나타나고, 구성요소 서비스에서 "내 컴퓨터"의 등록정보를 선택하면 아래 화면과 같이 "내 컴퓨터 등록정보"창이 나타납니다.
"내 컴퓨터 등록정보"창에서 MSDTC 탭을 선택합니다.

보안상의 이유로 MSDTC 설정을 보면, 기본적으로 로컬 코디네이터는 사용으로 선택되어 있으나, 원격 접속인 설정되어 있지 않습니다. 이를 설정하기 위해서는 "보안 구성" 버튼을 선택합니다. 그러면 아래 "보안 구성" 창이 나타납니다.

위 화면과 같이 기본적으로 DTC가 비활성화되어 있습니다.

위 화면과 같이 네트워크 DTC를 사용할 수 있도록 설정을 변경합니다.
이 때, 계정을 변경하시면 안됩니다. 계정을 변경하면 OS를 다시 설치해야할 수도 있습니다.(참고자료 참조)


그리고 확인 버튼을 누르면 MS DTC 서비스를 다시시작하게 됩니다.

MS DTC 서비스가 다시 시작되었습니다.


2) 방화벽 설정

처음 분산 트랜잭션 설정시, 방화벽 설정으로 가장 많은 고생을 하였습니다.
윈도우즈 방화벽을 사용하지 않으신다면 이 부분은 건너 뛰셔도 됩니다.
분산 트랜잭션을 위해서 기본적으로 TCP 135 포트와 RPC를 위한 여러 포트들을 열어 줘야 합니다.(자세한 사항은 참조자료 1을 참고해주세요)
저의 경우엔 사설망 내부에서 서버 대 서버로 분산 트랜잭션을 처리하는 거라, 윈도우즈 방화벽외엔 신경쓸 부분이 따로 없었습니다.
윈도우즈 방화벽 설정의 핵심은 분산 트랜잭션을 위한 msdtc.exe를 방화벽 예외로 등록하면 됩니다.
포트를 일일이 열어주는건 저도 해보진 못했네요...

윈도우즈 방화벽 실행

예외 프로그램으로 msdtc.exe 파일 추가(C:\WIndows\System32)

프로그램이 추가된 화면

예외 프로그램 등록 완료

3) 연결된 서버 설정
SQL Server Configuration Manager를 실행합니다.

별명 관리에서 새로운 별명 만들기를 선택합니다.

연결할 서버의 정보를 입력합니다.


SSMS에서 새로운 연결된 서버를 만들기 시작합니다.

앞서 추가한 연결할 서버의 별명을 입력합니다.

연결된 서버에 접속하기 위한 로그인 정보를 적어줍니다.

반드시 "RPC 내보내기", "원격 데이터 정렬 사용" 등의 옵션을 true로 만들어 주셔야 합니다.
그래야만 분산 트랜잭션이 정상적으로 동작됩니다.

4) 분산 트랜잭션 테스트
rpcing, dtcping 등을 이용하여 정상 동작 중인지 확인

SQL 상에서 SET XACT_ABORT ON 및 BEGIN DISTRIBUTION TRAN 적절히 추가하여 사용

위와 같은 과정을 거쳤음에도 DTC가 정상적으로 동작하지 않는다면, 방화벽에 문제일 공산이 크므로, 아래 참고자료를 바탕으로 방화벽 설정을 해보시기 바랍니다.

# 참고자료