2010-04-23 4 views
0

사용자 지정 Windows 서비스가 있습니다. 최근에 중첩 트랜잭션에 대해 TransactionScope를 사용하도록 업그레이드되었습니다. 그것은 내 오래된 dev에 기계 (XP에서 sp3) 및 테스트 서버 (서버 2003)에서 로컬로 잘 일했다. 그러나 2008 Server뿐 아니라 새 Windows 7 컴퓨터에서도 작동하지 않습니다. 2.0 프레임 워크를 목표로했습니다. 대신 3.5 타겟팅을 시도했지만 여전히 실패합니다.사용자 지정 Windows 서비스 내의 중첩 된 트랜잭션 문제

이상한 부분은 실제로 어떻게 실패했는지입니다. 예외는 발생하지 않습니다. 서비스 그 자체 만이 시간 초과됩니다. 추적 코드를 추가했는데 아래의 데이터베이스 조회 # 2에 대한 연결을 열 때 실패합니다. 또한 System.Transactions에 대한 추적을 활성화했습니다. 블록되지 않은 연결을 위해 블록을 쓰는 동안 문자 그대로 문자가 끊어집니다.

SQL 추적을 실행했지만 첫 번째 조회 만 표시됩니다. 나는 코드 트레이스를 넣었고 두 번째 검색 전에 라인을 추적했지만 이후에는 아무 것도 얻지 못했습니다. 두 SQL Server를 동시에 사용하는 경험이있었습니다 (둘 다 SQL Server 2005가 Server 2003에서 실행 됨). 연결 문자열이 SQL 계정을 사용하고 있습니다 (Windows 통합이 아님). 이 경우 모든 연결은 동일한 데이터베이스를 대상으로하지만 코드의 특성에 따라 MSDTC로 에스컬레이션됩니다.

여기에 기본 코드 구조입니다 :

TransactionOptions options = new TransactionOptions(); 
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options)) 
{ 
// Database lookup #1 

TransactionOptions options = new TransactionOptions(); 
options.IsolationLevel = Transaction.Current != null ? Transaction.Current.IsolationLevel : System.Transactions.IsolationLevel.ReadCommitted; 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) 
{ 
    // Database lookup #2; fails on connection.Open() 
    // Database save (never reached) 
    scope.Complete();<br/> 
} 
scope.Complete();<br/> 
} 

내 로컬 방화벽을 사용할 수 없습니다. 이 서비스는 일반적으로 네트워크 서비스를 사용하여 실행되지만 내 사용자 계정도 시도했습니다 (동일한 결과).

내 웹 응용 프로그램에서 널리 사용되는 것과 동일한 일반 기술을 사용하고 있으며 별다른 문제가 없습니다. 로컬 Windows Form 응용 프로그램 내에서 코드를 제거하고 올바르게 실행했습니다. 누구든지 추가 디버깅 아이디어 (또는 더 나은 솔루션)를 가지고 있다면 나는 그것들을 듣고 싶습니다.

+0

DB가 동일한가요? 같은 기계에 있었습니까? 분산 트랜잭션의 문제점을 고려하십시오 (MSTDC가 활성화되어 구성되어 있어야 함). 내 2 센트. –

+0

다른 데이터베이스 서버 (Windows Server 2003의 SQL 2005)를 대상으로 동일한 문제가 발생합니다. MSDTC는 확실히 관련되어 있습니다 (두 번째 SQL 호출을 등록하는 데 문제가있는 것처럼 보입니다). Windows 서비스 외부 (또는 Server 2003 서비스 내)에서 작동하는 이유는 저 밖에 있습니다. – pdwetz

+0

코드를 게시 할 수 있습니까? 서버 엔진은 항상 동일합니까? SQL 2005 또는 2008? 어떤 유형의 인증을 사용합니까, 통합 되었습니까? "구식 (sa)"입니까? –

답변

0

새 트랜잭션 스코프로 데이터베이스 조회를 둘러싸고 억제 옵션을 사용하십시오. select는 nolock 힌트가있는 경우에도 sql2005의 레코드를 잠급니다.

관련 문제