목요일, 12월 23, 2010

SQL Server 와 Oracle 10g(11g) 과의 분산트랜잭션(Distiributed Transaction) 구성

SQL Serer 에서 linked serer로 구성된 Oracle 10g(11g) 서버와의 분산트랜잭션(2pc)을 수행하도록 하려면 다음과 같은 내용을 점검해 보아야 한다.

[SQL Server 상에서]
1. SQL Server 박스에 DTC 가 활성화 되어야 한다.
분산 트랜잭션이 수행될때는 이 DTC가 활용된다. 그래서 반드시 이 서비스가 활성화 되어야 한다.
그리고, Oracle 과의 트랜잭션 호환성을 위해 다음과 같이 설정하라.


오라클과는분산 트랜잭션 인터페이스로 XA 트랜잭션을 사용한다.
XA 트랜잭션 사용에 체크하고, 트랜잭션 관리자 통신내에서 인바운드 허용과 아웃바운드 허용 그리고 인증 필요 없음에 체크한다.

2.RPC port 가 오픈되어 있는지 확인 하라.
요즘은 대부분 하드웨어적인 방화벽 내지는 윈도우에 내장된 방화벽을 운영하고 있는데
분산 트랜잭션은 RPC를 통해 처리 된다. 이 RPC port가 방화벽에서 Oracle 서버에 열려 있는지 확인하라.
이때, 주의 할 것은 RPC 통신은 RPC 종단점(endpoint)이 특별히 지정되어 있지 않고, 열려있다는 것이다. 따라서, RPC 종단점 맵퍼(endpoint mapper) 서비스(135 번)을 통해 rpc endpoint를 지정하게 된다.
사실, endpoint를 지정하지 않으면 기본값으로 1024 ~ 5000 번 까지 동적으로 활당된다.

그러므로, 우리가 열어야 할 포트는 135 과 rpc endpoint 범위가 된다.
http://support.microsoft.com/kb/908472

또한 특별히 지정하지 않으면이라 말은 그 범위를 지정할 수 있다는 것을 말하고 다음 MSDTC 설정에서 지정할 수 있다.






3. Oracle Client 설치
Oracle client 를 설치할때 주의할 것은 반드시 Oracle Services For Microsoft Transaction Server 컴포넌트를 설정했는지 확인한다.
이 컴포넌트가 설치되지 않으면 Oracle 과의 분산 트랜잭션이 수행되지 않는다.

또한 Windows 가 2008이라면 Oracle 11g Client를 설치할 때는 특별한 문제가 없겠지만
Oracle 10g client 를 설치하고자 할 경우 다음과 같이 OS 호환성 체크에서 오류가 발생해
인스톨이 진행되지 않을 수도 있다.

Version is 6.1 and only Versions: 5.0,5.1,5.2 or 6.0 are valid.

6.1 OS 가 누락되어서 발생하는 문제이니, 이때는 당황하지 말고 oraparam.ini 파일에서
다음과 같이 6.1 버전을 추가하라.

CERTIFIED_VERSION_FAILURE_MESSAGE

Windows = 5.0,5.1,5.2,6.0,6.1


[Windows-6.1-required]

# Minimum display colours for OUI to run

MIN_DISPLAY_COLORS = 256

# Minimum CPU speed required for OUI

# CPU = 300

[Windows-6.1-optional]


4. 분산트랜잭션 테스트

위 쿼리가 성공하는지 점검하라. 오류가 발생한다면
linked server 구성옵션을 점검하라.

Server option에서 RPC, RPC 내보내기가 설정되어야 한다.

[Oracle 서버 상에서]
5. Oracle 서버상에서는 SQL Server 로 135 으로의 텔넷 테스트와 RPC endpoint 범위의 시작점과 끝점에 텔넷테스트를 수행해 접속이 되는지 점검하라.

6. 기타 고려사항

DB 응용프로그램에서 분산트랜잭션을 사용하는 방법은 크게 두가지가 있다.
1. COM+ 을 이용한 방법
2. .NET 2.0 이상에서 System.Transaction을 사용하는 방법

여기서 System.Transaction 의 TransactionScope 객체를 이용할 때는 Local Tx와 2 PC를 스스로 판단하여 Transaction을 수행하기에 성능상의 이점이 있다.

또한, 위 2가지 방법 모두 분산트랜잭션을 수행할때 트랜잭션 고립화 수준이
기본값으로 최 상위인 Serializable임을 알아야 한다.

이것은 트랜잭션이 완료될때가지 범위내에 공유잠금이 풀리지 않는 것을 의미하고, 해당 범위에 데이터를 삽입할 수 도 없다. Lock정보에는 RangeS-S 로 나타나게 된다.

만약, 트랜잭션이 짧게 끝나지 않고 오래동안 지속된다면 이것은 분명 시스템의 응답시간을 떨어뜨리는 원인이 된다. 특히 Update 성 작업과 맞물려 교착상태에 빠트리게 하기도 한다.

그러므로, 분산 트랜잭션의 업무의 특성을 파악하고
가능한한 업무로직을 짧게 가져가고, 필요한 경우 트랜잭션 고립화 수준을 Read committed 로 조정하라.

[COM+의 선언적 트랜잭션을 사용하는 경우]
[Transaction(TransactionOption.Required, Isolation = TransactionIsolationLevel.ReadCommitted)]

[System.Transaction을 사용하는 경우]
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.ReadCommitted;
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{...}