2012-07-18 1 views
1

배경

MVC 응용 프로그램과 EntityFramework를 사용하는 동일한 데이터 액세스 라이브러리에 액세스하는 Windows 서비스가 있습니다. Windows 서비스는 여러 테이블에서 특정 활동을 모니터링하고 계산을 수행합니다.EF 프로젝트에서 System.Transactions를 사용할 때 고려해야 할 사항은 무엇입니까?

우리는 런타임에 컨텍스트에 대한 연결 문자열을 생성하는 수백 개의 데이터베이스에 대해 DAL 프로젝트를 사용하고 있습니다.

우리는 사용하는 데이터의 범위가 서로를 막을 잠재력이있는 매우 db 집약적 인 많은 함수 (저장 프로 시저와 EF 엔터티에서 호출하는 .NET 메서드 모두)를 가지고 있습니다.

Windows 서비스가 기다릴 수 없을 정도로 중요하지 않은 문제

. 무언가가 차단되어야한다면, Windows 서비스가 가능합니다. 이전에 나는 System.Transactions이 잠금을 최소화하기 위해 읽지 않은 상태로 트랜잭션 격리 수준을 설정할 때가는 길이라고 언급 한 많은 질문을 발견했습니다.

나는 이것을 시도했는데, 나는 무슨 일이 일어나고 있는지 오해하고있을 수 있으므로 설명이 필요하다.

Windows 서비스의 방법과 같이 구성되어있다 :

private bool _stopMe = false; 

public void Update() 
{ 
    EntContext context = new EntContext(); 
    do 
    { 
     var transactionOptions = new System.Transactions.TransactionOptions(); 
     transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; 
     using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions)) 
     { 
      List<Ent1> myEnts = (from e....Complicated query here).ToList(); 
      SomeCalculations(myEnts); 
      List<Ent2> myOtherEnts = (from e... Complicated query using entities from previous query here).ToList(); 
      MakeSomeChanges(myOtherEnts); 
      context.SaveChanges(); 
     } 
     Thread.Sleep(5000); //wait 5 seconds before allow do block to continue 
    }while (! _stopMe) 
} 

내 두 번째 쿼리를 실행

, 예외가 발생됩니다 :

The underlying provider failed on Open. 
    Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please 
    enable DTC for network access in the security configuration for MSDTC using the 
    Component Services Administrative tool. 
     The transaction manager has disabled its support for remote/network 
     transactions. (Exception from HRESULT: 0x8004D024) 

은 내가 호출되어서는 안된다는 가정 할 수있다 그 블록을 사용하여 하나 이상의 쿼리? 첫 번째 쿼리는 정상적으로 반환되었습니다. 이 작업은 한 번에 하나의 데이터베이스에서 수행됩니다 (다른 인스턴스는 다른 스레드에서 실행 중이며이 스레드의 인스턴스는 다른 스레드와 접촉하지 않습니다).

제 질문은 이것이 어떻게 사용되어야하는지 또는 내가 알아야 할 것이 더 있는지입니다.

참고 :이 기능은 모니터링 기능이므로 반복적으로 실행해야합니다.

+0

DbContext 또는 ObjectContext를 사용하고 있습니까? 현재 문제는 EF가 데이터베이스 연결의 수명을 제어하게하여 분산 된 트랜잭션이 필요한 각 쿼리에 대해 서로 다른 연결을 사용하고 있기 때문에 존재할 수 있습니다. Btw. 귀하의 거래는 절대 커밋되지 않습니다. –

+0

DbContext를 사용하고 있습니다. EntityFramework에서 연결을 좀 더 자세히 제어하는 ​​방법을 알고 싶습니다. 거래를 저지르는 것에 관해서는, 이것은 내가 거래에 대해 가지고있는 오해의 풍부함에 기인 할 것 같다. 오늘은 처음으로 System.Transaction을 사용 했으므로 아직 속도를 늦추지는 않았습니다. – CodeWarrior

+1

[이 기사]를 확인하십시오 (http://blogs.msdn.com/b/diego/archive/2012/01/26/exception-from-dbcontext-api-entityconnection-can-only-be-constructed-with-a). -closed-dbconnection.aspx) - DbContext API에서 연결의 수명을 제어하는 ​​방법에 대해 설명합니다. –

답변

1

코드에서 트랜잭션 범위를 사용하고 있습니다. 첫 번째 쿼리는 경량 db 트랜잭션을 사용하는 것처럼 보입니다. 두 번째 쿼리가 오면 트랜잭션 범위는 트랜잭션을 분산 트랜잭션으로 업그레이드합니다.

분산 트랜잭션은 MSDTC를 사용합니다.

여기서 오류가 발생하는 곳은 기본적으로 MSDTC가 활성화되어 있지 않습니다. 활성화되어 시작된 경우에도 원격 클라이언트가 분산 트랜잭션을 만들 수 있도록 구성해야합니다.

관련 문제