2010-08-20 6 views
2

나는 두 개의 linq 2 SQL 문을 트랜잭션 (SQL 서버는 방화벽 외부 등)에 있고 싶습니다. 다른 모든 통신은 작동하지만 TransactionScope()에서이 두 문장을 래핑 할 때 시작합니다. 우리가 한 MSDTC를 구성해야하지만, 방화벽 문제가 있습니다 (제가 생각하기에) 더 간단한 방법이 있습니까? 나는이 아래로 종기를 수행 할 작업의간단한 트랜잭션

기초 : (모두 후드 아래에 발동을 저장됩니다)

using (var transactionScope = new TransactionScope()) 
{ 
    Repository.DataContext.SubmitChanges(); 
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId); 
    transactionScope.Complete(); 
} 

이를 달성하는 가장 간단한 방법은 무엇입니까?

편집 :
먼저 나는이있어 : 트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용할 수있다. (HRESULT 예외 : 0x8004D024) 서버에서이 문제를 해결하기 위해 here 지침을 따랐습니다. 그러나 지침은 Windows 7 (내 dev에 상자)에 위의 대답에 대한 내 의견을 참조 적용되지 않는 것.

(win7이 아닌 상자에서) 문제를 해결 한 후 다음과 같이 표시됩니다. suggested에서 방화벽 문제 일 수있는 트랜잭션이 이미 암시 적으로 또는 명시 적으로 커밋되거나 중단되었습니다 (예외 : HRESULT : 0x8004D00E).

편집
난 그냥이 업데이트는 2 개의 다른 데이터베이스로 전송, .NET transactoinScope 클래스는 트랜잭션을 조정하는 MSDTC의 도움을 필요로하는 경우 원격 DB는 SQL 2000

답변

0

입니다 발견했다. SQL Server 2005 이상 버전에서 동일한 데이터베이스 내에 두 개의 업데이트가있는 경우 MSDTC가 관련되지 않습니다.

MSDTC가 com + 구성 요소 서비스에서 구성되고 컴퓨터 이름을 선택하고 속성을 선택하면 기본적으로 인증 안 함을 선택해야합니다.

다음 링크는 도움이 될 수 있습니다

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

+0

아하하니 원격 서버가 SQL 2000을 사용하고 있음을 발견했습니다. – Myster

0

당신은 할 수 항상 자신의 트랜잭션 내에서이 두 가지의 SP를 실행하는 새로운 저장 프로 시저를 만들? 빠른 n '더러운 ...

0

TransactionScope 당신이 SQL을 가지고 돌아 다니고 싶지 않다면 갈 길입니다. 방화벽을 통해 트랜잭션을 수행하는 데 익숙하지 않아서 문제가 발생하지는 않습니다. 발생하는 예외/오류를 게시 할 수 있습니까?

실제로 문제가 발생한 경우 저장 프로 시저를 랩핑하고 랩된 저장 프로 시저 내부에서 트랜잭션을 수행 할 수 있습니다.

0

트랜잭션 중 하나의 데이터베이스 만 처리해야하는 경우 새 SqlConnection을 만들고 열면됩니다. 이렇게하면 TransactionScope을 사용할 필요가 없습니다. 다음은 예입니다 : 당신이 Repository을 사용하기 때문에

using (var con = new SqlConnection("constr")) 
{ 
    con.Open(); 
    using (var tran = con.BeginTransaction()) 
    { 
     using (var context = new YourDataContext(con)) 
     { 
      // Do stuff 
      context.SubmitChanges(); 
      int generatedId = /* get this id */ 
      // Do stuff with id 

      context.SubmitChanges(); 
     } 
    } 
} 

, 당신은 배경에 컨텍스트를 작성해야하지만 아이디어는 동일합니다. 그리고 데이터베이스 트랜잭션과 연결을 처리하는 것을 잊지 마십시오.